跟踪进去后发现通过get_one(‘sql语句’)进行数据库操作
跟进get_one()函数进入include/mysql_class.php,发现这是定义数据库操作方法的文件,增删改查都在这里
get_one()函数构造好sql语句后,就调用$this->query($sql,$type)方法
通过调试跟进可以看到$func=‘mysql_query’,然后执行了$query = $func($sql, $this->link),进行数据库操作
增删改也是跟查一样,构造好sql语句赋值给$sql,然后调用$this->query()方法进行数据库操作
0×03 漏洞分析
了解了cms的传参过程和数据库操作过程后,就可以着手分析哪有漏洞了,首先是看一些明显的用户交互处(比如留言板,登录框)对应的代码段,然后用Seay源码审计系统的自动审计,验证漏洞。由于从前面了解了传参的过滤方式,所以基本可以确定留言板和登录框是没有注入和xss的,而前台只有留言板这一个交互点,所以就把目光放到后台上。
0×04 管理员密码重置后台登录界面有个‘忘记密码’,对应的文件是admin/admin/getpassword.php
直接找update语句,找到了两处更新管理员表的地方,并且都是在$action=‘next4’后
第一处
$abt_type的值可以通过post传参得到,所以很容易满足
从后往前推,update语句where的条件是admin_id=$cndes[2],而要执行update语句,要让
if($password=='')okinfo('javascript:history.back();',$lang_dataerror);
if($passwordsr!=$password)okinfo('javascript:history.back();',$lang_js6);
这两个if语句为假,即要传入不为空的$password和与$password相等的$passwordsr,这两通过post传入也很容易满足
然后就是if($codeok)成立,
$codeok = $db->get_one("SELECT * FROM $met_otherinfo WHERE authpass='$cnde' and lang='met_cnde'");$codeok的值要通过查询met_otherinfo表,而条件为authpass=$cnde,但是看到met_otherinfo表发现authpass字段没有数据