淡然点图标系统注入审计
环境搭建
- phpstudy 2018
- php-5.4.45 + Apache
- phpstrom 2018
- Seay代审系统工具
- CMS源码:淡然点图标系统
审计过程
- 先对主页进行刷新,触发sql语句执行,从而在mysql监控工具中截获到sql语句
- 观察sql语句中是否有可能可控的变量,经分析,”127.0.0.1“处可能是可控变量
- 跟进这条sql语句,验证该处的”127.0.0.1”是否可控,复制这条语句,在phpstrom打开该源码项目,全局搜索(ctrl + shfit + f)引号部分
1 | "SELECT * FROM `dd` WHERE `ip` LIKE " # '127.0.0.1'LIMIT 0 , 30 |
- 成功定位到了具体文件 php/function.php,进一步跟进代码
- 可以看到是在ywdd函数中执行了sql语句,传入了$ip参数,为了看$ip怎么来的,是否可控?需要继续跟进ywdd函数怎么实现的
- 全局搜索或者转到ywdd()函数实现,可以看到 ywdd(getIP()) 说明$IP是来自getIP()函数的返回值,但getIP()怎么返回的?返回的具体是什么?还是不知道,继续跟进getIP()的函数声明
可以看到,只要XFF头设置了,就把$realip变量赋值为XFF头,并作为getIP()的返回值!也就是说ywdd()中的$sql语句中的$ip是接受的XFF头,而我们知道XFF头是我们可以伪造的,是可控的,并且此处没有对XFF头进行任何过滤!于是SQL_XFF注入漏洞产生。对XFF构造sql语句,即可完成注入
简单的数据流
漏洞复现
1 | $SQL="SELECT * FROM `dd` WHERE `ip` LIKE '".$ip."'LIMIT 0 , 30"; |
- 抓包
- 修改XFF头,加单引号,成功报错
- 手工注入
1 | X-Forwarded-For: 127.0.0.1'union select 1,user(),3,database(),5 # |
补充:继续审计
sql-ymID
先全局正则搜索sql语句,一共就几条,挨着看看哪些变量疑似可控,再对其进行跟进
1 | (update|select|insert|delete|).*?where.* |
无任何过滤直接拼接执行了sql语句,极大可能存在SQL注入
function.php:
于是再去找一下函数调用,看看$ID是否可控,跳转到ywID函数调用处
v144.php:
直接GET接收id参数,也是毫无过滤,且参数可控,那么这里就找到一处SQL注入了。
确认了sql注入存在,接下来就去找怎么触发:
v144.php:
可以看到v144.php包含了function.php,并且GET接收传参id调用了SQL注入发生的函数**ywID()**,于是:
访问v144.php,GET传参id就可以注入了:/php/v144.php?id= or 1=1 – +
然而事情并不简单……
当我访问v144.php?id=1时,确出现了这个,好家伙,这是……让我滚?
那么想必开发者应该是在此处做了某种验证吧,我们先搜索一下这个关键词,试图寻找到相关验证逻辑
跟进一下,看看写得啥逻辑
v144.php:
这个校验逻辑也很简单,就是比对一下referer是否在授权域名之中。那我们把referer字段改为host就行了。
然再访问/php/v144.php?id=1,发现绕过了刚才的校验,但是缺失了未知参数:
那么还是如法炮制,去全局搜索”请输入完整”,寻找校验逻辑
v144.php:
还是很简单的逻辑,判断几个参数是否为空,只要有一个为空就退出
那么只需要按要求填充每个参数即可
/php/v144.php?api=ok&u=1&p=1&id=1
这样就可以开始注入了,购买失败是因为参数不是正确的编号
无回显位,要用盲注,sqlmap即可
sql-ywX
同理,这里也是一处
function.php:
v144.php:
还有几处很相似的注入就不再重复了