微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何演示二阶SQL注入?

所以我一直在尝试复制二阶sql注入.这是我准备的两个基于PHP的网站的示例模板.我们把它称为选民登记表.用户可以注册,然后您可以检查您是否是注册选民.

insert.PHP

<?PHP

$db_selected = MysqL_select_db('canada',$conn);
if (!db_selected)
    die("can't use MysqL: ". MysqL_error());

$sql_statement = "INSERT into canada (UserID,FirstName,LastName,Age,State,Town)
                    values ('".MysqL_real_escape_string($_REQUEST["UserID"])."','".MysqL_real_escape_string($_REQUEST["FirstName"])."','".MysqL_real_escape_string($_REQUEST["LastName"])."',".intval($_REQUEST["Age"]).",'".MysqL_real_escape_string($_REQUEST["State"])."','".MysqL_real_escape_string($_REQUEST["Town"])."')";

echo "You ran the sql query=".$sql_statement."<br/>";
$qry = MysqL_query($sql_statement,$conn) || die (MysqL_error());
MysqL_close($conn);
Echo "Data inserted successfully";
}
?>

select.PHP

<?PHP


$db_selected = MysqL_select_db('canada',$conn);
if(!db_selected)
    die('Can\'t use MysqL:' . MysqL_error());
$sql = "SELECT * FROM canada WHERE UserID='".addslashes($_POST["UserID"])."'";
echo "You ran the sql query=".$sql."<br/>";
$result = MysqL_query($sql,$conn);
$row=MysqL_fetch_row($result);

$sql1 = "SELECT * FROM canada WHERE FirstName = '".$row[1]."'";
echo "The web application ran the sql query internally=" .$sql1. "<br/>";
$result1 = MysqL_query($sql1,$conn);
$row1 = MysqL_fetch_row($result1);

MysqL_close($conn);
echo "<br><b><center>Database Output</center></b><br><br>";

echo "<br>$row1[1] $row1[2],you are a Voter! <br>";

echo "<b>VoterID: $row[0]</b><br>First Name: $row[1]<br>Last Name: $row[2]
    <br>Age: $row[3]<br>Town: $row[4]<br>State: $row[5]<br><hr><br>";
}
?>

因此,我故意使这个易受攻击,以显示二阶sql注入如何工作,用户可以在第一个名称部分输入代码(我目前卡住的地方,我尝试了很多不同的方式,但似乎我无法得到它可以做任何事情).
然后当一个人想要激活他在第一个名字部分中插入的代码时,他只需输入用户ID并插入代码即可.

例如:
我将在insert.PHP页面中输入:
userid = 17

firstname =(我需要在这里注入一些东西)

lastname = ..

年龄= ..

镇= ..

州= ..

然后,当我检查我的详细信息并输入17时,将激活注入的sql脚本.
我可以举几个例子来说明我可以通过这种方式展示哪种漏洞?

解决方法

使用名字:

' OR 1 OR '

这将在第二个sql生成一个where子句

WHERE FirstName = ” OR 1 OR ”

因此,结果将是表格中的第一条记录.

通过添加LIMIT子句,您可以从表中提取所有行:

‘ OR 1 ORDER BY UserID ASC LIMIT 0,1 —

显然它一次只能提取1行,所以你需要重复这一行并在LIMIT中增加0.此示例使用注释 – 终止剩余的sql,否则会导致查询失败,因为它会在LIMIT之后添加单引号.

以上是一个简单的例子,更复杂的攻击是使用UNION SELECT,它可以通过使用information_schema来访问整个数据库.

您还在其中一个查询中使用addslashes().这不像MysqL_real_escape_string()那样安全,反过来:使用其中任何一个转义引号都不如使用预处理语句或参数化查询(例如PDO或MysqLi)那样安全.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐