espcms代码审计

以前的代码审计都是在CTF比赛题里面进行对于某一段代码的审计,对于后端php整体代码和后端整体架构了解的却很少,所以有空我都会学习php的代码审计,以提高自己

环境就直接用的是phpstudy,学习的前期对于环境的搭建以能够满足我们学习的需求即可,没有必要将每个组件分开安装,反而本末倒置了。

使用的代码审计工具是 Seay源代码审计系统

同时参考书籍也是尹毅的 《代码审计-企业级web代码安全架构 》

作者的博客:

https://seay.me/

espcms是2014版本的。

我们使用seay代码审计工具

常见的代码审计思路有以下四种:

1,根据敏感关键词回溯参数传递过程
2,查找可控变量,正向追踪变两个传递过程
3,寻找敏感功能点,通读功能点代码
4,直接通读全文代码

espcms的代码审计,我们跟书中一样,使用对于敏感函数回溯参数过程。

先按照书上审计的过程走一遍,我们再自己根据敏感函数寻找一些漏洞

我们找到

22条提示我们可能存在sql注入漏洞,继而我们点击该条

可以看到这里将我们传入的$parentid代入$sql语句中进行查询,而$parentid变量的值是在oncitylist()函数里面没有进行设么过滤,传参过来的函是accept()

这里仅对$parentid变量进行了是否为空的检测。

右键定位accept()函数

可以看到accept函数里面的内容

在这个位置对于输入的$k进行了daddslashes函数,daddslashes函数实际上是包装之后的addslashes函数

即对于我们输入的parentid参数输入的单引号等预定义字符进行过滤,不过之前的$sql语句里面我们发现

我们可以可以发现对于$parentid参数没有单引号进行闭合,所以 daddslashes 实际上没有起到任何作用。

如果这个语句写成下边这种情况:

$sql = "select * from $db_table where parentid='$parentid'";

同时还是像之前一样使用了addslashes()函数,那么除非有宽字节注入或者其他的特殊情况,不然我们就不能进行注入了。

我们发现这里有注入之后,可以看到该函数在important这个类里面

于是我们全局变量搜索出现了important类的位置,重点关注的是new 了important类的地方

可以看到在adminsoft/index.php这个页面new 了important这个类

点击之后可以看到在index.php页面$archive和$action这两个变量都有默认的值,我们在本地搭建的网站不输入参数直接访问就可以看到(当然在代码的逻辑里面也可以很清楚看出)

可以看到当我们没有任何参数输入的时候,archive=adminuser&action=login

但是实际上我们是想

调用important类里面的oncitylist函数,同时传递一个parentid的值。

在这里传入的$action与’on’字符串进行连接,组合成为新的$action,所以我们传入的$action=citylist,这里我们令$archive也为citylist,本来觉得archive为何值不重要,不过用其他array组里面的值就会报错,应该是代码里面其他地方做了限制。

因为是在admin的界面下进行的注入,所以我们需要先登录,再在url输入我们构造的payload

现在可以看到已经出现了citylist

不过我们的目的是传递parentid参数,

因为我们访问成功之后实际上已经调用了important类里面的oncitylist方法,不过因为我们没有主动传递parentid的值,所以其默认为1而已。

于是我们手动使用get方法传递parentid的值

构造payload之后,我们可以看到现在返回页面的citylist只剩下了北京,根据我们之前的分析,此处parentid存在不需要单引号闭合的sql注入漏洞,于是我们开始常规注入

字段数为5

回显位置: 3

在3的位置查询数据库名字和用户名

OK,跟着书上的漏洞复现成功,第一弹结束,第二弹的分析过程就自己分析吧,站在巨人的肩膀上固然会看的很远,但是更需要自己向上攀登才能到达更远的地方

猜你喜欢

转载自www.cnblogs.com/Cl0ud/p/12180435.html