代码审计工具

个人比较喜欢使用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);
?>

上述代码,用户可以任意读取文件。

总结

在实际的审计过程中,可以结合自动化审计工具,与黑盒测试相结合,工具提示可能有漏洞,阅读代码,查看危险函数,并回溯参数,检查是否有过滤,对漏洞进行验证,可以快速审计处漏洞。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐