主页 > 网络知识 > PHP代码审计之入门实战(2)

PHP代码审计之入门实战(2)

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('<','&#60;',$str); $str = str_replace('>','&#62;',$str); $str = str_replace('?','&#63;',$str); $str = str_replace('%','&#37;',$str); $str = str_replace(chr(39),'&#39;',$str); $str = str_replace(chr(34),'&#34;',$str); $str = str_replace(chr(13).chr(10),'<br />',$str); return $str; }

可以发现 我们的存储XSS所用到的尖括号完全被过滤掉了:

$str = str_replace('<','&#60;',$str); $str = str_replace('>','&#62;',$str);

这也导致了 管理员后台可以直接看到XSS Payload ,场面一度非常尴尬:

 

15797018332062.jpg

 

用户评论的核心代码也被过滤了:

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函数细节可以参考文章上面贴的代码:

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!