전공쪽/Lord of Sql injection

우로보로스이다. 그 뱀이 꼬리 물고있는 그거 맞다. pw를 알아맞추는 문제라는 것을 알 수 있다. 별다른 조건이 없어서 1=1을 줘봤는데... 아무런 값이 안나온다. DB안에 아무런 값이 없는 것 일수도 있다. 검증차 union select 로 값을 줘봤다. 따라서 칼럼은 pw하나밖에 없다는 것을 알 수 있다. 그리고 테이블은 텅 비어있다는 것 또한 알 수 있다. 이러면 $result['pw']와 #_GET['pw']를 일치시켜 주는 것이 중요하다! 그리고 ===도 보이는데, 이건 엄격한 비교로 형식까지 비교를 한다. 예를 들어 지금 result[pw]=1 이고 , get[pw]=' union select 1 #이다. 그래서 생각을 좀 해보다가 이렇게 검색했다. 콰인이라는 것이 나와서 이걸로 검색해보기로..
컬럼은 no, ip, email로 3개이다. $_SERVER[REMOTE_ADDR]이 뭔지 찾아봤더니 이름 대로 ip를 반환하는 것이였다. 먼저 첫번째 쿼리에서는 joinmail의 값이 있으면 사용자의 정보를 table에 집어넣는다. 여기서 별다른 검사가 없어서 취약점이 존재한다. 그 다음 쿼리는 no=1 이거나 접속자의 ip와 동일한 아이템을 가지고 온다. 이렇게 말이다. 사용자의 정보는 no=0으로 들어간다. 마지막은 관리자의 email을 알아 맞추라는 내용이다. 삽질 많이했는데 sleep 함수같은 것도 안먹히는 것 같아서 좀 생각해보았다. 정답은 서브쿼리를 주는데 mysql에서는 자신 테이블에서 참조가 안되는데 테이블에 별칭을 주면 된다. 별칭은 as를 통해 줄 수 있다. (select email ..
일단 union 필터링, 괄호 필터링인 것 같다. 그리고 pw를 알아내야 한다. error based sql injection으로 풀 수 있는 문제이다. 그런데 괄호가 다 필터링 되어있어서 함수를 사용하는게 힘들 것 같다. 일단 괄호가 필요없는 like와 case when then을 사용해주기로 했다. 그리고 비밀번호의 길이를 구할 수 있는 방법이 딱히 없는 것 같아서 생각 안하기로 했다. 이건 그냥 모든 ascii 검사했는데 안나오면 그 때 멈추면 되기 때문에.. 그런데 error을 어떻게 유발할까 많이 생각을 해보았고 함수는 안되서 큰수를 곱해주는 것을 생각했다. 0으로 나누는 것은 error가 뜨지 않고 warning 이 나온다. 이 방법을 사용해서 like 함수로 비밀번호를 구하는 자동화를 만들겠..
'와 \를 검사해준다. 그리고 이번에는 패스워드까지 알아맞춰야 하는 brute force문제인 듯 하다. 그런데 일단 쿼리가 한번 실행 되고 나서 \,'검사를 한다. 일단 time baesd로 어느정도 해결이 가능할 듯하다. 지금까지 배운것들이 모두 가능하다는 전제하에 문제를 풀어야 될 것 같다. 일단은 비밀번호의 길이 먼저 구해보겠다. 일단 비밀번호의 길이는 8자인 것을 알아냈다. 이러면 상당히 쉬워진다. 동일한 방법으로 비밀번호 8자만 구하면 된다. d948b8a0이 나왔다. #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests import time header={"Cookie":"PHPSESSID=5b4vff***tab335qk..
조건은 id의 길이가 7까지 밖에 되지 않는다는 것. 그리고 no변수가 숫자인지 체크 한다는 것이다. 저 7바이트 가지고는 아무것도 못할 것 같아서 is_numeric함수에 대해 찾아보았다. php 공식 매뉴얼이다. '42' is numeric 1337 is numeric 1337 is numeric 1337 is numeric 1337 is numeric 1337.0 is numeric '0x539' is NOT numeric '02471' is numeric '0b10100111001' is NOT numeric '1337e0' is numeric 'not numeric' is NOT numeric array ( ) is NOT numeric 9.1 is numeric NULL is NOT numer..
이번에는 좀 특이한 문제이다. 패스워드 검사를 하지 않는다. 첫번째 쿼리에서 보낸결과로 두번째 쿼리가 구성된다. 일단 \ 검사를 안하니 id에는 \를 넣어줘서 내가 원하는 쿼리문을 구성시켜줘봤다. 이러면 실제 쿼리문은 테이블에 있는 모든 값을 가져와야하는데 query2가 뜨지 않은 것으로 보아 테이블에는 아무 값도 없는 것 같다. 이러면 select union을 사용해서 값을 만들어줄 필요가 있겠다. 일단 시나리오는 다음과 같다. 첫번째로 pw를 구성할 때 union select로 값을 2개 반환하는데, 2번째(패스워드) 값이 다시 select union으로 구성된 문장이여야 한다. 두번째에는 id만 가져오는 것을 모르고 union select admin,1 같은것을 계속 주면서 삽질을 했다.;;
hell fire와 다른점은 sleep 함수도 막혔다는 점이다.. benchmark 함수도 막혀있기 때문에 어떻게 해야 고민을 좀 해보았다. if 문 반환값과 order by를 이용한 방법도 이용이 가능하다..! 일단 email 길이는 30이다. 이 방법에 따르면 if 조건이 참이면 admin이 rubiya보다 먼저 나와야한다. 이를 파이썬의 find함수로 구분해줄 것이다. find함수는 문자열에서 해당 문자열의 위치를 반환한다. 이것도 이진탐색을 해주었다. 비밀번호가 꽤 길어서... 그냥 돌리는 것보다 3배이상 빠른 것 같다. 클리어! 상당히 재미있는 방법이였다. #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests import t..
hellfire의 풀이를 시작해 보도록 하겠다. 먼저 이제 컬럼이 id, email,score로 세개가 되었다. 그리고 쿼리를 보니 order에 따라서 모든 값을 다 가져온다. 그리고 출력할때 admin의 email은 *로 숨겨서 출력을 한다. 이를 볼때 admin의 email을 알아 맞추는 게임이 되겠다. union이 막혀있고 지금까지 배운 내용으로 보아서는 time based injection 내용인 것 같아서 테스트를 해보았다. 실제로 위 쿼리를 보내면 3초이따가 결과가 수행된다. sleep(2)를 주고 파이썬에서 실행시간 측정을 해보았다. 2초가 걸리는 것을 알 수 있었고 이를 이용해 brute forcing을 하면 될 것 같았다. 그리고 너무 느릴 거 같아서 이진탐색을 적용했다. 그리고 emai..
OSOR2
'전공쪽/Lord of Sql injection' 카테고리의 글 목록