lord of sql injection

컬럼은 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..
이제부터 푸는 방법이 바뀌었다. 오류기반 sql injection 기법들을 적극 활용하겠다. 가장 중요하게 쓴 것은 if(조건, ture, false) 였다. 먼저 if(length(pw)=32, pow(2,9999),1) 을 통해 pw의 길이가 32바이트라는 것을 알았다. 그리고 ascii 인코딩임을 확인하였다. 이제 substr로 단순한 brute forcing을 진행하였다. 코드는 다음과 같다 #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests header={"Cookie":"PHPSESSID=****"} password='' a='' for i in range(1,33) : admin=0 guest=0 b=[0,0,0,0] ..
OSOR2
'lord of sql injection' 태그의 글 목록