728x90
반응형
상단에 나오는 쿼리문은 DB에 해당 쿼리문으로 데이터가 들어간다고 알려준다.
id의 값이 guest, pw의 값이 ‘’인 파라미터가 있다.
query : select id from prob_dragon where id='guest'# and pw=''
아래에는 php 코드가 나와있으며, 이걸 참고해서 문제를 푸는 것 이다.
해당 php 코드에서 자세하게 봐야 하는 부분은 이 부분인 것 같다.
preg_match 조건문 부분을 보면 다음과 같이 필터링하고 있다.
- prob
- _
- .
- ()
문제를 풀기 위해서는 id의 값이 admin 이어야 문제가 풀리는 듯 하다.
그런데 pw 값을 입력받고 있으나 앞에서 주석처리가 되고 있다.
if(preg_match('/prob|_|\\.|\\(\\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
if($result['id'] == 'admin') solve("dragon");
앞에 있는 id 파라미터 값 뒤의 # 주석을 우회해야 pw에서 id값을 변조할 수 있을 것 같다.
#은 SQL의 주석에서 한 줄 주석으로 알고 있다.
즉, #의 이후인 and pw=’’ 만 주석처리가 된다.
그럼 해당 내용을 개행문자를 사용하여 다음 줄로 넘어가면 될 것 같다.
공격문을 작성해보았다.
?pw=%0a% 1 and id ='admin => 왜인지 모르겠으나 1이 아닌 0을 넣으면 문제가 안풀린다...
728x90
반응형