PHP-代码审计项目-淡然点图标系统-SQL_XFF注入

本文最后更新于 2024年10月21日 晚上

审计环境

  • phpstudy 2018
  • php-5.4.45 + Apache
  • phpstrom 2018
  • Seay代审系统工具
  • CMS源码:淡然点图标系统

审计过程

  1. 先对主页进行刷新,触发sql语句执行,从而在mysql监控工具中截获到sql语句

image

  1. 观察sql语句中是否有可能可控的变量,经分析,”127.0.0.1“处可能是可控变量

image

  1. 跟进这条sql语句,验证该处的”127.0.0.1”是否可控,复制这条语句,在phpstrom打开该源码项目,全局搜索(ctrl + shfit + f)引号部分
1
"SELECT * FROM  `dd` WHERE  `ip` LIKE "        # '127.0.0.1'LIMIT 0 , 30

image

  1. 成功定位到了具体文件 php/function.php,进一步跟进代码

image

  1. 可以看到是在ywdd函数中执行了sql语句,传入了$ip参数,为了看$ip怎么来的,是否可控?需要继续跟进ywdd函数怎么实现的

image

  1. 全局搜索或者转到ywdd()函数实现,可以看到 ywdd(getIP()) 说明$IP是来自getIP()函数的返回值,但getIP()怎么返回的?返回的具体是什么?还是不知道,继续跟进getIP()的函数声明

image

  1. 可以看到,只要XFF头设置了,就把$realip变量赋值为XFF头,并作为getIP()的返回值!也就是说ywdd()中的$sql语句中的$ip是接受的XFF头,而我们知道XFF头是我们可以伪造的,是可控的,并且此处没有对XFF头进行任何过滤!于是SQL_XFF注入漏洞产生。对XFF构造sql语句,即可完成注入

  2. 简单的数据流

image

漏洞复现

1
$SQL="SELECT * FROM  `dd` WHERE  `ip` LIKE  '".$ip."'LIMIT 0 , 30";
  1. 抓包
  2. 修改XFF头,加单引号,成功报错

image

  1. 手工注入
1
X-Forwarded-For: 127.0.0.1'union select 1,user(),3,database(),5 #

image