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

sqli-labs靶场通关笔记:第29-31关 HTTP参数污染

第29关 HTTP参数污染

本关设置了web应用防火墙(WAF),利用白名单保护机制来检测和拦截恶意请求。看本关源代码。

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
//disable error reporting
error_reporting(0);// take the variables 
if(isset($_GET['id'])) // 检查URL参数中是否存在id
{$qs = $_SERVER['QUERY_STRING']; // 获取完整的查询字符串$hint=$qs; // 保存查询字符串用于提示$id1=java_implimentation($qs); // 模拟Java处理HPP的函数,提取第一个id参数值$id=$_GET['id']; // 获取PHP解析的id参数值//echo $id1;whitelist($id1); // 调用白名单过滤函数,验证id1是否为纯数字//logging the connection parameters to a file for analysis.$fp=fopen('result.txt','a'); // 以追加模式打开日志文件fwrite($fp,'ID:'.$id."\n"); // 记录请求的id参数fclose($fp); // 关闭文件资源// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; // SQL查询语句,存在SQL注入风险$result=mysql_query($sql); // 执行SQL查询$row = mysql_fetch_array($result); // 获取查询结果if($row) // 如果查询到结果{echo "<font size='5' color= '#99FF00'>";	echo 'Your Login name:'. $row['username']; // 输出用户名echo "<br>";echo 'Your Password:' .$row['password']; // 输出密码echo "</font>";}else {echo '<font color= "#FFFF00">';print_r(mysql_error()); // 输出MySQL错误信息echo "</font>";  }
}else { echo "Please input the ID as parameter with numeric value";} // 提示用户输入数值型ID//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input) // 白名单过滤函数,只允许纯数字输入
{$match = preg_match("/^\d+$/", $input); // 使用正则表达式检查是否为纯数字if($match){//echo "you are good";//return $match;}else{	header('Location: hacked.php'); // 非数字输入重定向到hacked.php//echo "you are bad";}
}// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string) // 模拟Java处理HPP的函数
{$q_s = $query_string;$qs_array= explode("&",$q_s); // 将查询字符串按&分割为数组foreach($qs_array as $key => $value) // 遍历参数数组{$val=substr($value,0,2); // 获取参数名前两个字符if($val=="id") // 找到第一个id参数{$id_value=substr($value,3,30); // 提取id参数值(从第3个字符开始的30个字符)return $id_value;echo "<br>";break;}}
}
?>

这里的WAF白名单只允许输入的参数id为纯数字,阻止了sql注入攻击。

本关的关键点在于,调用java_implimentation函数处理查询字符串,这个函数的作用是模拟 Java 对 HTTP 参数的解析方式,只返回第一个id参数的值。而直接使用$_GET['id']获取的id是PHP默认行为(如果有多个id参数,则取最后一个)。

WAF检测的是传入的第一个id值,如果在传入第二个id值中构造sql语句,则会产生注入攻击。

这种传递多个参数,干扰正常逻辑,影响服务器判断的行为,就是HTTP参数污染(HPP)。

构造测试语句:

这里id=1返回的是用户Dumb,id=1&id=2返回的是用户Angelina,也就是说实际上第一个id被用于白名单检查,第二个id被用于sql查询。

 通过参数污染构造攻击语句:

?id=1&id=-1' union select 1,2,database() --+

 第30关 "闭合

第31关 '')闭合 

http://www.xdnf.cn/news/15616.html

相关文章:

  • 【前端】输入框输入内容时,根据文本长度自动分割,中间用横杠分割
  • 模版匹配的曲线好看与否有影响吗?
  • Git 中如何比较不同版本之间的差异?常用命令有哪些?
  • 金属伪影校正的双域联合深度学习框架复现
  • Prometheus错误率监控与告警实战:如何自定义规则精准预警服务器异常
  • Spring Boot 应用优雅停机与资源清理:深入理解关闭钩子
  • SQLite 数据库字段类型-详细说明,数据类型详细说明。
  • ES v.s Milvus v.s PG
  • kafka 单机部署指南(KRaft 版本)
  • 代码训练营DAY35 第九章 动态规划part03
  • cocosCreator2.4 Android 输入法遮挡
  • 车载监控录像系统:智能安全驾驶的守护者
  • AI编程工具 Cursor 和 Kiro 哪个的Claude更好用!
  • 如何使用Python将HTML格式的文本转换为Markdown格式?
  • Java基础篇
  • Altera Quartus:编译完成后自动生成pof文件
  • 20250718-6-Kubernetes 调度-Pod对象:环境变量,初始容器,静态_笔记
  • VR平台应该具备哪些功能?怎样选择VR平台?
  • 【playwright篇】教程(十六)[macOS+playwright相关问题]
  • 填坑 | React Context原理
  • AndroidX中ComponentActivity与原生 Activity 的区别
  • STM32+w5500+TcpClient学习笔记
  • JAVA中StringBuilder类,StringJoiner类构造函数方法简单介绍
  • [2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测
  • 基于 HT 的 3D 可视化智慧矿山开发实现
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 无人机传感器模组运行与技术难点分析
  • 嵌入式数据结构之顺序表总结
  • 自学力扣:最长连续序列
  • 小结:Spring MVC 的 XML 的经典配置方式