对某开源cms进行代码审计 ,发现虽然该cms虽然对参数参数进行了过滤,但是过滤有限,依然可以通过其他方法绕过进行sql注入,本文将将通过正则匹配的方式,并通过自动化查找工具,寻找某cms中存在的sql注入漏洞
漏洞分析
由于该cms过滤了引号,那这里我们寻找的拼接的地方主要是以括号,反引号和直接拼接的。
首先寻用括号包裹的sql语句,可以使用正则进行查找=.?".?(“\s*?.\s*?($\w+)或者``=.?”.?("\s*?.\s*?(front:😃。这里简单解释一下正则的意思,首先sql语句存在的地方一般是一个赋值语句,所以需要有等号:=.?,然后需要匹配左括号加引号,然后使用\s?.\s*?匹配连接变量的.然后使用($\w+)`匹配变量
我们找到这样一处
这里的参数被两个括号包裹,并且没有被引号包裹,所以这里只需要使用后括号对语句进行闭合而不需要引号。
然后一路向前追溯 c i d s 的来源,发现他是通过 cids的来源,发现他是通过 cids的来源,发现他是通过sons以,为分隔符的得到的,然后向前一路追溯最终发现是可以通过front::post(‘search_catid’)的得到,即这里的传参可控。由于中间的参数需要以,为分隔,所以注入的语句中不能出现逗号,这里很好操作,有很多方法可以绕过,这里使用from for绕过
2.路由分析
该cms是一个典型的MVC架构的web应用程序。
在初始化方法中,通过GET请求取case和cat参数分别
然后在main函数中调用dispath方法,首先会判断如果同时满足为admin,case值不为admin和install,则会将case的值加_admin,如不满足则加_act作为控制器名,接着将传入的方法 c a t 后添 加 c a t i o n 作为方法名。最后使用 cat后添加_cation作为方法名。最后使用 cat后添加c<