写这文章算是记录学习点滴,不正确的地方还请指出,共同学习。
文章参考尹毅大神的著作:代码审计-企业级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代码审计的朋友,也算是自己的学习方法,巩固所得。希望感兴趣的朋友一起探讨学习,本人也是一枚很菜很菜的菜鸟。
领取专属 10元无门槛券
私享最新 技术干货