SQLI LABS | Less-18 POST-Header Injection-Uagent field-Error based
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-18/
虽然,靶场中是一个登录页面,但是想一下本关的标题 "Header Injection - Uagent field",就知道,本关的注入点是 HTTP 请求头中的 UserAgent 字段。
既然注入点在 UserAgent 字段,那么此时,我们就要考虑两个问题:
-
什么情况下,服务端会需要接收客户端的 UserAgent 字段的值?
-
HTTP 请求包中的 UesrAgent 是否可以修改?怎么修改?
针对第一个问题,我们知道 UserAgent 里传递的一般是客户端的浏览器型号,比如使用的是手机浏览器还是 PC 浏览器访问的服务端,以及浏览器的版本信息这些内容。服务端收集 UserAgent 一般是为了返回适合用户客户端的页面。
那么第一个问题的答案就很明显了,我首先得成功登录,然后服务端才会收集我 UserAgent 的信息,毕竟,如果任意一个人访问了服务端,服务端都会收集这些信息的话,耗费的资源就太大了。
针对第二个问题,HTTP 请求包中的 UserAgent 怎么改?这里笔者推荐使用 HackBar 插件(当然你会爬虫的话当我没说;BurpSuite 也是可以的):
HackBar 插件详解:功能介绍、安装步骤与使用教程_hackbar插件-CSDN博客文章浏览阅读1.7k次,点赞29次,收藏9次。HackBar 是一个辅助进行网络渗透测试和安全评估的浏览器插件。它提供了一系列快捷工具和功能,可以帮助用户执行各种网络攻击和测试,包括 XSS、SQL 注入、CSRF、XXE、路径穿越等漏洞,以下是 HackBar 插件的一些主要特点和功能:自定义请求发送:HackBar 允许用户自定义 HTTP 请求,并可以通过插件直接发送这些请求。用户可以手动构造 GET 和 POST 请求,并添加自定义的 HTTP 头部、参数等信息。编码/解码工具。_hackbar插件https://blog.csdn.net/m0_73360524/article/details/141298896
首先,我们需要拿到一个可以使用的用户名和密码,这里笔者使用的是 Dumb : Dumb
:
接下来,打开 HackBar 插件,点击 Load URL 并勾选 UserAgent 后,对 UserAgent 字段传入以下测试字段:
测试 Payload 01: 1' and updatexml(1,concat(0x7e,database(),0x7e),1)#' # 结果: 报错
可以看到,当我们传递 Payload 01 给服务器时,服务器就发生了报错,回显了部分后端模板,但泄露的太少了,不足以让我们猜测完整的语句,所以笔者又传递了以下测试参数:
测试 Payload 01: 1' and updatexml(1,concat(0x7e,database(),0x7e),1)#'Payload01 结果: near '' at line 1测试 Payload 02: 1'~ and updatexml(1,concat(0x7e,database(),0x7e),1)#'Payload02 结果: near '~ and updatexml(1,concat(0x7e,database(),0x7e),1)#'', '127.0.0.1', 'dumb')'
Payload 02 爆出来的结果就比较多了,看样子,它做的很像是 insert
操作,但笔者也不能确定,不过起码知道它传递了几个值了,所以,攻击 Payload 如下:
-- 获取当前服务器正在使用的数据库的名称攻击 Payload: 1','127.0.0.1',updatexml(1,concat(0x7e,database(),0x7e),1))#'笔者备注: 0x7e 是字符 ~ 号,用于标识服务器报出来的数据。
可以看到,我们已经成功获取了当前站点使用的后端数据库的信息。至此,SQLI LABS Less-18 POST-Header Injection-Uagent field-Error based 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-18 POST-Header Injection-Uagent field-Error based 后端的部分源码,以及笔者做的笔记:
<?php//including the Mysql connect parameters.include("../sql-connections/sqli-connect.php"); // 获取数据库连接函数error_reporting(0);function check_input($con1, $value) // 对用户输入的内容进行过滤{if (!empty($value)) {// truncation (see comments)$value = substr($value, 0, 20);}// Stripslashes if magic quotes enabledif (get_magic_quotes_gpc()) {$value = stripslashes($value);}// Quote if not a numberif (!ctype_digit($value)) {$value = "'" . mysqli_real_escape_string($con1, $value) . "'";} else {$value = intval($value);}return $value;}$uagent = $_SERVER['HTTP_USER_AGENT']; // 获取 HTTP 请求头中的 UserAgent 字段$IP = $_SERVER['REMOTE_ADDR']; // 获取客户端的 IP 地址(更准确的说,是最后一个代理的 IP 地址),该值无法伪造echo "<br>";echo 'Your IP ADDRESS is: ' . $IP;echo "<br>";// echo 'Your User Agent is: ' .$uagent;// take the variablesif (isset($_POST['uname']) && isset($_POST['passwd'])) {// 对用户输入的 uname 与 passwd 都进行了过滤$uname = check_input($con1, $_POST['uname']);$passwd = check_input($con1, $_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 = mysqli_query($con1, $sql);$row1 = mysqli_fetch_array($result1, MYSQLI_BOTH);if ($row1) { // 如果成功查询出了用户echo '<font color= "#FFFF00" font size = 3 >';$insert = "INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; // 将用户代理、IP、用户名一起插入到数据库中(发生了报错注入,因为 UserAgent 未过滤)mysqli_query($con1, $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(mysqli_error($con1)); // 插入成功,也会回显错误信息(如果有的话)echo "<br><br>";echo '<img src="../images/flag.jpg" />';echo "<br>";} else {echo '<font color= "#0000ff" font size="3">';//echo "Try again looser";print_r(mysqli_error($con1)); // 插入失败,会回显错误信息echo "</br>";echo "</br>";echo '<img src="../images/slap.jpg" />';echo "</font>";}}?>