首先从index.php入手:
包含了/model/hdwiki.class.php,这个文件是处理路由的关键文件,在构造函数中首先调用的是init_request.php,用来初始化请求信息:
1 | function init_request(){ |
看完这段代码,可以初步知道这个CMS是首先拿到query_string的值,再用连接符-
来划分控制器和方法,形如:http://127.0.0.1/index.php?admin_main-login
,表示的就是/control/admin_main.php文件中的dologin方法。
另外,还对GET、POST和COOKIE参数进行字符转义,以及检查GET请求中是否有下列关键字:
1 | function checksecurity() { |
这次出现SQL注入漏洞的地方是/control/edit.php中的docompare函数,触发这个函数的路由即为:http://127.0.0.1/index.php?edit-compare
前三个if语句可以不用管。第四个if语句判断参数eid数组的前两个元素是不是数字,如果不是就会跳转到index.php页面。第147行代码,通过array_slice函数获取参数eid的前两个元素,代入到get_edition函数中。
这里有一个小的trick:POST和GET传入的参数,键不会自动排序的,传的时候是什么顺序,接收到的就是什么顺序 ,也就是说传给get_edition()函数的参数是我们可以控制的,这是发生注入的关键之一。
继续跟进get_edition函数:
当get_edition()函数的参数是数组的时候,则会直接用逗号拼接数组中的所有值,然后直接带入数据库查询,这里就是发生注入的关键之二。所以我们最终的payload为:
1 | POST /index.php?edition-compare HTTP/1.1 |
使用布尔盲注,通过页面回显来判断查询语句的正确性。