环境搭建

  • 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

补充:继续审计

sql-ymID

先全局正则搜索sql语句,一共就几条,挨着看看哪些变量疑似可控,再对其进行跟进

1
(update|select|insert|delete|).*?where.*

image-20241230142757741

无任何过滤直接拼接执行了sql语句,极大可能存在SQL注入

function.php:

image-20241230163542415

于是再去找一下函数调用,看看$ID是否可控,跳转到ywID函数调用处

v144.php:

image-20241230163513961

直接GET接收id参数,也是毫无过滤,且参数可控,那么这里就找到一处SQL注入了。

确认了sql注入存在,接下来就去找怎么触发:

v144.php:

image-20241230163432344

image-20241230163513961

可以看到v144.php包含了function.php,并且GET接收传参id调用了SQL注入发生的函数**ywID()**,于是:

访问v144.php,GET传参id就可以注入了:/php/v144.php?id= or 1=1 – +

然而事情并不简单……

当我访问v144.php?id=1时,确出现了这个,好家伙,这是……让我滚?

image-20241230175914695

那么想必开发者应该是在此处做了某种验证吧,我们先搜索一下这个关键词,试图寻找到相关验证逻辑

image-20241230164528130

跟进一下,看看写得啥逻辑

v144.php:

image-20241230165048682

这个校验逻辑也很简单,就是比对一下referer是否在授权域名之中。那我们把referer字段改为host就行了。

image-20241230165900574

然再访问/php/v144.php?id=1,发现绕过了刚才的校验,但是缺失了未知参数:

image-20241230175834746

那么还是如法炮制,去全局搜索”请输入完整”,寻找校验逻辑

v144.php:

image-20241230170816923

还是很简单的逻辑,判断几个参数是否为空,只要有一个为空就退出

那么只需要按要求填充每个参数即可

/php/v144.php?api=ok&u=1&p=1&id=1

这样就可以开始注入了,购买失败是因为参数不是正确的编号

image-20241230170930940

无回显位,要用盲注,sqlmap即可

sql-ywX

同理,这里也是一处

function.php:

image-20241230172826664

v144.php:

image-20241230172855184

还有几处很相似的注入就不再重复了