include/function.php
function post($val,$filter = 'strict') { return $filter(isset($_POST[$val])?$_POST[$val]:''); }??? 继续找到strict的定义处:
include/function.php
//严格过滤字符串中的危险符号 function strict($str) { if(S_MAGIC_QUOTES_GPC) { $str = stripslashes($str); } $str = str_replace('<','<',$str); $str = str_replace('>','>',$str); $str = str_replace('?','?',$str); $str = str_replace('%','%',$str); $str = str_replace(chr(39),''',$str); $str = str_replace(chr(34),'"',$str); $str = str_replace(chr(13).chr(10),'<br />',$str); return $str; }可以发现 我们的存储XSS所用到的尖括号完全被过滤掉了:
$str = str_replace('<','<',$str); $str = str_replace('>','>',$str);这也导致了 管理员后台可以直接看到XSS Payload ,场面一度非常尴尬:
用户评论的核心代码也被过滤了:
index/module/info_main.php
function add_comment() { safe('comment'); global $global,$smarty,$lang; $channel = post('channel'); $com_page_id = post('page_id'); $com_email = post('email'); $com_rank = post('rank'); $com_text = post('text'); if($channel == '' || $com_page_id == '' || $com_rank == '' || $com_email == '' || $com_text == '') { $info_text = $lang['submit_error_info']; } ... ... }存储XSS 扑gai~
前台用户CSRF判断 思路网站有留言板和文章评论,如何存在CSRF越权的话可以在评论或者留言处贴构造好的CSRF链接,来进行CSRF攻击。23333 感觉稳了!定位到相关功能代码:
index/module/user/deal.php
function edit_pwd() { safe('edit_pwd'); global $global,$smarty,$lang; $old_pwd = post('old_pwd'); $new_pwd = post('new_pwd'); $re_pwd = post('re_pwd'); if(strlen($old_pwd) < 6 || strlen($old_pwd) > 15 || strlen($new_pwd) < 6 || strlen($new_pwd) > 15 || $new_pwd != $re_pwd) { $info_text = $lang['submit_error_info']; }else{ $use_password = md5($old_pwd); $obj = new users(); $obj->set_where('use_id = '.$global['user_id']); $obj->set_where("use_password = '$use_password'"); if($obj->get_count() > 0) { $use_password = md5($new_pwd); $obj->set_value('use_password',$use_password); ... ... } 结果index/moudle/user/deal.php
// 这里需要提供旧密码 $use_password = md5($old_pwd); $obj = new users(); $obj->set_where('use_id = '.$global['user_id']); $obj->set_where("use_password = '$use_password'"); if($obj->get_count() > 0)没有旧密码 是不可能改密码的,所以CSRF攻击其他用户的想法GG
可控变量过滤虽然作为一个CMS,用户可控变量很多,文章浏览等功能不可避免地要进行数据库操作,但是该系统基本上把所以可控变量都给过滤了。
session 过滤使用了$filter = 'strict'严格模式,关于strict函数细节可以参考文章上面贴的代码: