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

PHP代码审计之入门实战

CMS名称:新秀企业网站系统PHP版

官网

版本:这里国光用的1.0 正式版 (官网最新的版本有毒,网站安装的时候居然默认使用远程数据库???迷之操作 那站长的后台密码岂不是直接泄露了?疑似远程数据库地址:server.sinsiu.net )

下载地址蓝奏云

Windows下使用PHPStudy可以直接安装,搭建起来还是很简单的。

防护策略

虽然这是一个不知名的小系统,但是安全加固还是考虑到的,很多本应该有漏洞的地方均被加固修复了,导致国光我一开始一直碰壁,=,= 废话不多说,下面直接列举本次审计碰到的一些坑。

伪造IP注入过滤 思路

首先在后台发现有记录用户IP的功能:

 

PHP代码审计之入门实战

 

哦豁,会不会有传说中的伪造IP地址注入攻击呢???使用数据库监测工具,发现在注册用户发表评论的时候。用户的IP地址也的确被带入SQL语句中查询了:

select * from php_safe where saf_ip = '10.211.55.2' and saf_action = 'message'

VSCode走起,根据关键词来查找相关功能代码:

include/function.php

//获取客户端IP function get_ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); }elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){ $ip = getenv('HTTP_X_FORWARDED_FOR'); }elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'),'unknown')){ $ip = getenv('REMOTE_ADDR'); }elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){ $ip = $_SERVER['REMOTE_ADDR']; }else{ $ip = '0.0.0.0'; } if(!is_numeric(str_replace('.','',$ip))) { $ip = '0.0.0.0'; } return $ip; } 结果

获取IP的关键防护代码:

if(!is_numeric(str_replace('.','',$ip))) { $ip = '0.0.0.0'; }

获取到的IP值,去除掉.后如果不是数字类型的话就重置为0.0.0.0 ,扑街,这条思路行不通,赶紧换个思路去

存储型XSS过滤 思路

网站前台有留言功能,留言就会想到存储型XSS,2333 嗝:

 

15797012978745.jpg

 

结果

定位到留言函数的代码:

index/module/info_main.php

function add_message() { safe('message'); global $global,$smarty,$lang; $mes_email = post('email'); $mes_type = post('type'); $mes_title = post('title'); $mes_text = post('text'); $mes_show = post('show'); if($mes_email == '' || $mes_type == '' || $mes_title == '' || $mes_text == '') { $info_text = $lang['submit_error_info']; }else{ $mes_add_time = time(); if($mes_show != '2') { $mes_show = '0'; } $obj = new message(); $obj->set_value('mes_user_id',$global['user_id']); $obj->set_value('mes_type',$mes_type); $obj->set_value('mes_email',$mes_email); $obj->set_value('mes_title',$mes_title); $obj->set_value('mes_text',$mes_text); $obj->set_value('mes_add_time',$mes_add_time); $obj->set_value('mes_show',$mes_show); $obj->set_value('mes_lang',S_LANG); $obj->add(); if(intval(get_varia('sentmail'))) { $email_title = '您的网站有了新的留言'; $email_text = "[$mes_type] $mes_title <br /> $mes_text"; call_send_email($email_title,$email_text,$global['user_id'],$mes_email); } $info_text = $lang['submit_message']; } $smarty->assign('info_text',$info_text); $smarty->assign('link_text',$lang['go_back']); $smarty->assign('link_href',url(array('channel'=>'message'))); }

可以看到前台用户传入的数据经过了post()函数,追踪到post()函数的定义处:

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