当前位置: 首页 > news >正文

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 字段,那么此时,我们就要考虑两个问题:

  1. 什么情况下,服务端会需要接收客户端的 UserAgent 字段的值?

  2. 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>";}}?>

http://www.mrgr.cn/news/61589.html

相关文章:

  • 3. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验1:PWM驱动LED呼吸灯)
  • C++ STL queue 的实现
  • 只有.git文件夹时如何恢复项目
  • LabVIEW汽车状态监测系统
  • 数据结构————map,set详解
  • k8s的配置和存储(ConfigMap、Secret、Hostpath、EmptyDir以及NFS的服务使用)
  • 【ShuQiHere】硬盘的S.M.A.R.T.: 自我监测、分析与报告技术
  • snmpwalk样例
  • KKcms 1.32 代码审计过程
  • Python | Leetcode Python题解之第520题检测大写字母
  • Brilliant Labs CEO Bobak Tavangar揭秘:AI驱动的开源AR眼镜Frame
  • 动态类的控制
  • 交换机端口三种链路类型
  • 《贪婪算法实战:寻找最短无序连续子数组的深度解析与实现》
  • Java | Leetcode Java题解之第519题随机翻转矩阵
  • 采用STM32CubeMX和HAL库的定时器应用实例
  • 【编程语言】在C++中使用map与unordered_map
  • c语言中结构体传参和实现位段
  • unseping攻防世界
  • 百度二面算法:合法的括号字符串(贪心解法)
  • 【机器学习】环境搭建及Sklearn鸢尾花数据集
  • Python | Leetcode Python题解之第519题随机翻转矩阵
  • Python中的切片是什么,它有什么用处?
  • 25_DNS:域名系统详解
  • C++ | Leetcode C++题解之第519题随机翻转矩阵
  • windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(四)