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注入如何工作,用户可以在第一个名称部分输入代码(我目前卡住的地方,我尝试了很多不同的方式,但似乎我无法得到它可以做任何事情). 例如: firstname =(我需要在这里注入一些东西) lastname = .. 年龄= .. 镇= .. 州= .. 然后,当我检查我的详细信息并输入17时,将激活注入的SQL脚本. 解决方法
使用名字:
' OR 1 OR ' 这将在第二个SQL中生成一个where子句
因此,结果将是表格中的第一条记录. 通过添加LIMIT子句,您可以从表中提取所有行:
显然它一次只能提取1行,所以你需要重复这一行并在LIMIT中增加0.此示例使用注释 – 终止剩余的SQL,否则会导致查询失败,因为它会在LIMIT之后添加单引号. 以上是一个简单的例子,更复杂的攻击是使用UNION SELECT,它可以通过使用information_schema来访问整个数据库. 您还在其中一个查询中使用addslashes().这不像mysql_real_escape_string()那样安全,反过来:使用其中任何一个转义引号都不如使用预处理语句或参数化查询(例如PDO或MySQLi)那样安全. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |