php代码审计入门
代码审计工具个人比较喜欢使用sublime编辑器和法师的seay源代码审计系统。代码审计思路主要思路有三种:1.参数的正向追踪,2.参数的逆向追踪,3.通读全文。在审计过程中,将黑盒测试与白盒测试结合到一起,黑盒测试在代码审计中是非常重要的,burp一定要常开!!!一.逆向追踪找到危险函数或者sql语句中的参数,并且回溯参数,查看参数是否用户可控,如果用户可控,利用黑盒测试构造payload,进行
代码审计工具
个人比较喜欢使用sublime编辑器和法师的seay源代码审计系统。
代码审计思路
主要思路有三种:1.参数的正向追踪,2.参数的逆向追踪,3.通读全文。
在审计过程中,将黑盒测试与白盒测试结合到一起,黑盒测试在代码审计中是非常重要的,burp一定要常开!!!
一.逆向追踪
找到危险函数或者sql语句中的参数,并且回溯参数,查看参数是否用户可控,如果用户可控,利用黑盒测试构造payload,进行漏洞验证。
二.正向追踪
找到用户可控的参数,并追踪参数,查看参数有没有带入到一些危险函数,或者sql语句中执行。
三.通读全文
index文件,index是一个程序的入口文件,通常只读一读index文件,就可以大致了解整个程序的框架,运行的流程。
函数集文件,一般在index文件中都会包含函数集文件,这些文件都是一些公共的函数,提供给其他文件同意调用。
安全过滤文件
配置文件
对于各种不同漏洞的审计技巧
一.sql注入漏洞
1.数字型注入
<?php
$con = mysql_connect("localhost","root","root");
if (!$con){die('Could not connect: ' . mysql_error());}
mysql_select_db("test", $con);
$id = stripcslashes($_REQUEST[ 'id' ]);
$query = "SELECT * FROM users WHERE id = $id ";
$result = mysql_query($query)or die('<pre>'.mysql_error().'</pre>');
while($row = mysql_fetch_array($result))
{
echo $row['0'] . " " . $row['1'];
echo "<br />";
}
echo "<br/>";
echo $query;
mysql_close($con);
?>
以上述代码为例,第五行代码,id传入了一个值, id没有经过任何过滤,被带到sql语句中被执行,不管有没有输出,只要被带进数据库进行执行就可以,没有输出,可以使用盲注,报错注入。
stripcslashes()函数功能为返回反转义后的字符串,可识别类似 C 语言的 \n,\r,… 八进制以及十六进制的描述。
payload:id=1 and sleep(5)
ps:遇到不知道功能的函数,可以查看php开发手册。
2.字符型注入
<?php
$con = mysql_connect("localhost","root","root");
if (!$con){die('Could not connect: ' . mysql_error());}
mysql_select_db("test", $con);
$id = stripcslashes($_REQUEST[ 'id' ]);
$query = "SELECT * FROM users WHERE id = '$id' ";
$result = mysql_query($query)or die('<pre>'.mysql_error().'</pre>');
while($row = mysql_fetch_array($result))
{
echo $row['0'] . " " . $row['1'];
echo "<br />";
}
echo "<br/>";
echo $query;
mysql_close($con);
?>
与数字型注入类似,id参数传递未进行过滤,在sql语句中$id被单引号包裹,需要使用单引号将id进行闭合。
payload:id=1’ and sleep(5)–+
常用的过滤函数:
intval()强制转换为整型,这种过滤毫无办法
str_replace()子字符串替换,这种过滤方法可以双写进行绕过
addslashes()返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
过滤函数有很多,遇到了可以使用手册进行查询。
is_numeric()判断是否为数字
3.宽字节注入
<?php
$con = mysql_connect("localhost","root","root");
mysql_query("SET NAMES 'gbk'");
mysql_select_db("test", $con);
$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;
$query = "SELECT * FROM users WHERE id ='{$id}' ";
$result = mysql_query($query)or die('<pre>'.mysql_error().'</pre>');
while($row = mysql_fetch_array($result))
{
echo $row['0'] . " " . $row['1'];
echo "<br />";
}
echo "<br/>";
echo $query;
mysql_close($con);
?>
以上述代码为例,第五行id参数,被函数addslashes()函数转义,无法使用单引号,但在第三行,sql语句将数据库编码设置为GBK编码,这就给了我们绕过的机会,在GBK编码中,当一个ASCII码大于127的字符与另一个字符拼接,就会组成一个汉字,可以使用%df%27进行绕过,单引号被转义就会出现,%df%5c%27,%df与%5c连在一起形成一个汉字运,单引号就逃逸出来。
payload:id=1%df%27 and sleep(5)
二.文件上传漏洞
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')){
...//判断过后对文件处理的进一步操作
}
上述代码,是对上传文件的MIME类型进行检测,可以通过抓包修改Content-Type的值进行绕过。
$uploaded_ext =substr($uploaded_name, strrpos($uploaded_name,.')+1);
if((strtolower( $uploaded_ext)=="jpg" ||l strtolower($uploaded_ext)=="jpeg" &&
(Suploaded_size<100000)
上述代码,是对上传文件的扩展名,以及文件大小进新检测,可使用00截断进行绕过。
三.文件包含漏洞
文件包含的函数有:
include()
include_once()
require()
require_once()
<?php
include($_GET['file']);
?>
以上述代码为例,可以包含任意文件
<?php
include($_GET['file'].".php");
?>
上述代码为,有限制的本地文件包含,可以使用%00进行截断(条件为php版本小于5.3.4)
payload:?file=C://Windows//win.ini%00
四.命令(代码)之执行漏洞
常用函数
exec()
system()
popen()
passthru()
proc_open()
pcntl_exec()
shell_exec()
eval()
assert()
preg_replace(),作用是执行正则表达式,这个函数的原型为:mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]),如果在构造正则表达式的时候,使用了/e修正符,这时,preg_replace() 就会将 replacement 参数当作 PHP代码执行。
反引号` 实际上是使用 shell_exec()函数
<?php
$target=$_REQUEST['ip'];
$cmd = shell_exec('ping '.$target);
echo "<pre>{$cmd}</pre>";
?>
使用 http://127.0.0.1/cmd.php?ip=|net user可以进行命令执行
五.任意文件下载
<?php
$filename = $_GET['filename'];
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg'
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>
上述代码,用户可以任意下载文件。
<?php
$filename = $_GET['filename'];
readfile($filename);
?>
上述代码,用户可以任意读取文件。
总结
在实际的审计过程中,可以结合自动化审计工具,与黑盒测试相结合,工具提示可能有漏洞,阅读代码,查看危险函数,并回溯参数,检查是否有过滤,对漏洞进行验证,可以快速审计处漏洞。
更多推荐
所有评论(0)