ESPcms代码审计
源码下载地址:http://yesky.91speed.org.cn/sw/180001_190000/rar/espcms_utf8_5.4.12.05.14.rar
1.自动审计
打开审计目录,点击自动审计,找到一条SQL注入的漏洞提示,进行验证分析
2.手工验证
双击进来,在选中该变量后,在下方可以看到该变量的传递过程,并且点击下方的变量传递过程也可以直接跳转到该项代码处,可以非常直观地帮助我们看清整个变量在该文件的传递过程。另外我们可以看到Sparentid变量是在如下代码段获得的:
2.1定位函数
右键选中,定位到accept函数
跳转到class_function()函数
可以看到这是一个获取GET、POST、COOKIE参数值的函数
我们传入的k=parentid,var=R,表示以POST和GET方式都可以获取parentid参数
最后经过daddslashes函数对单引号进行过滤
原始语句为$sql = "select * from $db_table where parentid=$parentid";
并不需要单引号来闭合,于是可以直接注入。
2.2搜索分析
再回来看。
我们发现这里有注入之后,可以看到该函数在important这个类里面
发现在首页index.pnp里面存在实例化
看到一个include文件的操作,但是经过addslashes()函数单引号过滤,故无法截断使其包含任意文件。
只能包含本地的PHP文件。
2.3分析思路
但实际我们想
通过创建一个对象,随着oncitylist函数调用,传递一个parentid变量
在传递的$action与'on'拼接,组合成新的$action,所以我们传入的$action=citylist,这里我们令$archive也为citylist即可。
之后可以看到城市列表,存在注入。
2.4验证注入
进一步构造payload
这里需要先登陆到后台,再修改URL构造
不过我们的目的是传递parentid参数
因为我们访问成功之后实际上已经调用了important类里面的oncitylist方法,不过因为我们没有主动传递parentid的值,所以其默认为1而已。
返回结果为:北京
接着手工注入。
http://127.0.0.1/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid=2 union select 1,2,user(),4,5
到此确定了这里存在SQL注入漏洞。