小白代码审计初体验:记一次espcms旧版本SQL注入审计

写这文章算是记录学习点滴,不正确的地方还请指出,共同学习。

文章参考尹毅大神的著作:代码审计-企业级web代码安全架构里的一个入门例子。

准备工作

espcms源码2014版本,Seay源代码审计系统(也是尹毅大神开发的软件)

漏洞位置

假设我们能控制$parentid的值,就能够控制这条查询语句了。进入该漏洞位置

跳转到citylist.php文件

红框内显示了变量$parentid在citylist.php中提到的位置

第一条详细信息指出$parentid由函数accept函数得到,回溯查看accept函数

选中accept函数,右击选择定位函数,发现在/public/class_function.php中定义了该函数,详细信息如下:

该函数存在两个参数,$k,$var分别对应我们传入的parentid 和 R

进入switch选择,大致作用是获取用户提交的内容经过daddslashes函数处理,相同操作定位该函数,看看它对获取后的内容做了什么处理

同样位于/public/class_function.php

函数大致作用是包装了addslashes函数对内容进行处理,addslashes函数作用

了解了对内容进行了addslashes处理(除非其他特殊情况,如:宽字节注入或其他特殊情况),如若查询语句存在需要单引号闭合则利用不了了,列举的例子不用闭合

No.2语句是我加上去的,为了说明单引号闭合问题,No.1不需要闭合,直接构造语句,不会被addslashes影响,而No.2需要闭合,闭合了单引号,会在addslashes作用下在单引号'前加反斜杠,变成/'

综合之前的分析得出漏洞位于class important下的oncitylist方法中,接下来利用则需要指向class important下的oncitylist方法中.

漏洞利用

找出实化class important类的页面(选中important类,右击选择全局搜索)

发现在adminsoft/index.php中实化了该类进入对应的点

进入实化类语句需要经过前面的条件语句

确保变量$archive 在数据组中存在,且$archive.php文件在adminfile/control/下存在,前面的admin_ROOT在文件前面定义了这个常量(程序安装路径)

在include这个文件($archive.php),接下来的语句大致是在引用的文件中调用$action方法,再下来返回去寻找这两个变量的来源

如果$archive为空,则取值adminuser

如果$action为空,则取值login

执行后续语句,则是包含了文件adminuser.php并且调用了其中的onlogin方法

如果指向我们的漏洞位置:citylist.php文件且调用oncitylist方法不就达到利用的目的了么?

则我们只要访问实化了class important的index.php转入$archive=citylist&$action=citylist因为

提交了的action会自动添加on,因此达到访问存在漏洞的oncitylist方法,并且传入$parentid=()括号内为构造的语句

该漏洞是需要登录的,所以需要登录一次(演示效果)

更改parentid的值为构造的语句,达到注入的目的。

因为union select 的语句查询字段数需要与数据库中对应的表的列数对应,笨方法逐次+1,即:

逐次加到5时,不在返回报错信息,则说明对应有5个字段,显示位为3,可以利用该位置来回显,我们需要的信息,如:

总结:

本文的手法是依据危险操作,查找用户可控的内容,回溯定位,找到漏洞点,在构造利用方法。漏洞点出现在模块调用函数位置。

此文写给正在初学php代码审计的朋友,也算是自己的学习方法,巩固所得。希望感兴趣的朋友一起探讨学习,本人也是一枚很菜很菜的菜鸟。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410G0S5UZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券