代码审计篇入门
程序员文章站
2022-04-30 10:40:05
...
一、漏洞挖掘与防范
1.搭建环境
<?php
header("content-type:text/html;charset=utf-8"); //设置编码
$uid = $_GET['id'];
$sql = "SELECT * FROM userinfo where id = $uid";
$conn = mysql_connect('localhost','root','root');
mysql_select_db("test",$conn);
$result = mysql_query($sql,$conn);
print_r('当前SQL语句: '.$sql.'<br / >结果: ');
print_r(mysql_fetch_array($result));
?>中文
中文路径的问题似乎解决不了
有个不像是解决办法的解决办法
应该是已经可以正常显示中文了,但由于游览器编码问题导致乱码
成功链接
二、漏洞挖掘
注入漏洞:
1.sql注入
http://127.0.0.1/PHPCodeAudit/injection.php?id=-1 union select 1,user(),3,4
2.二次urldecode注入
<?php
$a = addslashes($_GET['p']);
$b = urldecode($a);
echo '$a= '.$a;
echo '<br / >';
echo '$b= '.$b;
?>
3.gpc/rutime魔术引号
(1)addslashes函数
<?php
$str = "phpsafe'";
echo addslashes($str);
?>
(2)mysql_real_escape_string
<?php
$con = mysql_connect("localhost", "root","root") ;
$id = mysql_real_escape_string($_GET['id'],$con);
$sql = "select * from test where id = '".$id."'";
echo $sql;
?>
单引号被转义
%27为单引号,被转义。
(3)intval等字符转换
<?php
$id = intval("1 union select ");
echo $id;
?>
把变量全部转换为int型,不容易注入
4.XSS漏洞
5.文件包含
<?php
define("ROOT",dirname(__FILE__).'/');
$mod = $_GET['mod'];
echo ROOT.$mod.'.php';
include(ROOT.$mod.'.php');
?>
(1)远程文件包含
设置:
allow_url_include = ON
不设置的话:
远程文件包含:
POST php输入流
(2)文件包含截断
<?php
include $_GET['a'].'.php';
?>
无法使用因为php5.3以后修复了00截断这个漏洞
(3)文件读取下载漏洞
问题出在@file_get_connents($url)
../../../../1.php
(4)文件上传漏洞
成功上传
这里使用burp效果更佳
(5)文件删除漏洞
session_destroy()
poc :delete&filename=../../index.php
(6)如何防御
利用点一般为:
由越权操作引起可以操作未授权操作的文件
要操作更多文件需要跳转目录
大多都是直接在请求中传入文件名
防御:
对权限的管理要合理
有的文件操作不需要直接传入文件名
要避免目录跳转的问题
6.代码执行漏洞
该漏洞主要由 eval()/assert()/preg_replace()/call_user_func_array()/array_map()引起的
<?php
preg_replace("/\[(.*)\]/e", '\\1', $_GET['str']);
?>,
搜索(.*)的内容作为第一组结果,\\1作为第一组结果的填充,执行str=后面的语句
<?php
@preg_replace("//e", $_GET['h'], "Access Denied");
echo preg_replace("/test/e", $_GET["h"], "jutst test");
?>
<?php
function test($code)
{
}
// test("{${phpinfo()}}");
//提交?h=phpinfo()
// echo preg_replace("/test/e",$_GET["h"],"jutst test");
//提交?h=[php]{${phpinfo()}}[/php]
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", 'test("\\1")', $_GET["h"]);
//echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "test('\\1')", $_GET["h"]);
?>
7.预防手段:
addslashes()和mysql_[real_]escape_string函数过滤sql语句
escapeshellcmd()和escapeshellarg()命令
escapeshellcmd()过滤一些参数转化为^
escapeshellarg()
参数白名单限定某些参数