注册 登录
  • 用代码行数测算软件开发进度如同按重量测算飞机的制造进度@比尔.盖茨

浅谈PHP代码入门审计

渗透技巧 BLGene 124次浏览 5464字 2个评论

简介

代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析,并提供代码修订措施和建议。审计对象包括并不限于对Windows和Linux系统环境下的以下语言进行审核:java、C、C#、ASP、PHP、JSP、.NET。

内容

  1. 前后台分离的运行架构
  2. WEB服务的目录权限分类
  3. 认证会话与应用平台的结合
  4. 数据库的配置规范
  5. SQL语句的编写规范
  6. WEB服务的权限配置
  7. 对抗爬虫引擎的处理措施

漏洞解析

浅谈PHP代码入门审计

SQL注入审计

SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。SQL注入的产生原因:

  1. 不当的类型处理;
  2. 不安全的数据库配置;
  3. 不合理的查询集处理;
  4. 不当的错误处理;
  5. 转义字符处理不合适;
  6. 多个提交处理不当。

现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select、Insert、Update和Delete四种类型,注入也是对这四种基本操作的拼接产生的。接下来笔者将以Select为例引导新手初步了解SQL注入。Select是数据库的查询操作,所以常常出现在像文章查看和搜索这些地方,缺陷代码如下:

<?php
$conn =mysql_connect('localhost','root','root');
mysql_select_db("test",$conn);
$id = $_GET['id'];
$sql = " select * from user where id =$id";
$result = mysql_query ($sql,$conn);
print_r(mysql_fetch_row($result));
?>

未对输入参数进行任何过滤,在ID里输入恶意代码即可注入。在实际环境中程序员不会写这样的代码,一般都会用addslashes()等过滤函数对从web传递过来的参数进行过滤,运维人员配置PHP环境是一般会开启魔术引号GPC,即magic_quotes_gpc=On的情况 下,如果输入的数据有单引号(’)、双引号(”)、反斜线(\)与 NUL(NULL 字符)等字符都会被加上反斜线进行转义处理。不过GPC在PHP5.4版本后就取消了,所以现在一般都用addslashes()函数来代替GPC进行过 滤处理。目前用PHP开发的应用一般是MVC的框架模式进行开发,对GET、POST和COOKIE等传递的参数通常使用addslashes()函数进行转义,并引入一个类似common.php的文件进行处理addslashes()函数对接收的参数进行过滤,尤其是单引号。处理代码如下:

<?php

if (!empty($_GET))
{
$_GET = addslashes($_GET);//利用addslashes()函数过滤参数
}
if (!empty($_POST))
{
$_POST = addslashes($_POST);
}
if (!empty($_COOKIE))
{
$_COOKIE = addslashes($_COOKIE);
}
function addslashes($value)
{
if (empty($value))
{
return $value;
}
else
{
if (!get_magic_quotes_gpc())
{
$value=is_array($value) ? array_map('addslashes', $value) : addslashes($value);
}
else
{
$value=is_array($value) ? array_map('addslashes', $value) : mystrip_tags($value);
}
return $value;
}
}
?>

addslashes会对GET、POST、COOKIE传递的参数进行转义,然而一些编码解码的函数像urldecode、base64decode的使用会导致绕过addslashes函数的全局防护,以urldecode函数为例,缺陷代码如下:

<?php
require_once('common.php');
$conn = mysql_connect('localhost', 'root', 'root');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn);
$id = isset($_GET['id']) ? urldecode($_GET['id']) : 1;//利用urldecode编码解码
$sql = "SELECT * FROM news WHERE id='{$id}'";
$result = mysql_query($sql, $conn);
print_r(mysql_fetch_row($result));
?>

当输入http://192.168.13.133/test.php?id=1%2527即可产生注入。

如果在php链接mysql的时候,设置了“set character_set_clinet=gbk”就会出现一个编码转换的问题,也就是能产生宽字节注入。character_set_client变量就是作为客户端发送的查询中使用的字符集。简单来说%df’会被过滤函数转义为%df\’ ,%df\’= %df%5c%27 在使用gbk编码的时候会认为%df%5c是一个宽字节%df%5c%27=縗’,这样也会产生注入。

XSS审计

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 xss分为存储型的xss和反射型xss, 基于DOM的跨站脚本XSS。

反射型xss审计通过寻找可控没有过滤(或者可以绕过)的参数,通过echo等输出函数直接输出。寻找的一般思路就是寻找输出函数,再去根据函数寻找变量。一般的输出函数有这些:print , print_r , echo , printf , sprintf , die , var_dump ,var_export。

存储型xss审计和反射型xss审计时候思路差不多,不过存储型xss会在数据库“中转”一下,主要审计sql语句update ,insert更新和插入。

<?php
mysql_connect('localhost','root','root');
mysql_select_db('test');
mysql_query("set names gbk");
if(isset($_POST['submit'])){//利用POST方法传递参数
$title=$_POST['title'];
$con=$_POST['con'];
$sql="INSERT INTO `xss` (`id` ,`title`,`con`)VALUES (NULL , '$title', '$con');";//执行sql语句
if(mysql_query($sql)){
echo "留言成功";
}else{
echo "留言失败";
}
}else{
$sql="select * from xss";
if($row=mysql_query($sql)){
while($rows=mysql_fetch_array($row)){
echo$rows['id'].$rows['title'].$rows['con']."<br>";
}
}
}
?>
<html>
<form action="?action=insert"method="post">
标题:<input type="text" name="title"><br>
内容:<textarea name="con"></textarea>
<input type="submit"name="submit" value="提交">
<form>
</html>

构造我们的payload即可进行xss注入<script>alert("xss")</script>。xss也是一个防范的重点,我们可以使用htmlspecialchars函数把预定义的字符&、’、”<、>转换为实体,输出的时候不需要特殊处理,浏览器会把这些标签还原的,这样就能防范大多数的xss注入了。

<?php
if( array_key_exists( "Message", $_GET ) && $_GET[ 'Message' ] != NULL ) {
$Message= htmlspecialchars( $_GET[ 'Message' ] );//使用htmlspecialchars函数转义
echo "<pre>Hello ${Message}</pre>";
}
generateSessionToken();
?>

xss并不仅仅局限于留言板、论坛发表等位置,通过审计代码可以发现,在一些其他位置,只要用户可控,也是可能存在xss漏洞的。

文件上传漏洞审计

文件上传应该是最常用的漏洞了,上传函数就那一个 move_uploaded_file();一般来说找这个漏洞就是直接ctrl+f 直接开搜。遇到没有过滤的直接传个一句话的webshell上去。上传的漏洞比较多,Apache配置,iis解析漏洞等等。在php中一般都是黑白名单过滤,或者是文件头,content-type等等。

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";//文件存放路径
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {//上传失败
echo '<pre>Your image was not uploaded.</pre>';
}
else {
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}?>

上面是一段DVWA的文件上传漏洞,可以上传任意的文件。当然一般没有哪个程序员会去这样的编写,上传文件的存储目录禁用执行权限、文件的后缀白名单(jpg、png、jpeg等),注意0x00截断攻击、不能有本地文件包含漏洞、文件重命名等。

<?php
function getExt ($filename) {
return substr ($filename,strripos($filename,'.')+1); //substr()函数返回字符串的一部分,strripos() 函数查找字符串从左到右在另一字符串中最后一次出现的位置
}
$disallowed_types = array('jpg','png','gif');
$FilenameExt = strtolower(getExt($_FILES["file"]["name"])); //获取文件扩展名strtolower()将扩展名字符转换小写
if (!in_array($FilenameExt, $disallowed_types)) { //如果获取文件扩展名不在白名单数组里,则返回disallowed type。
die("disallowed type");
}
else {
//文件名用time()函数获得10进制时间戳命名,在1-10000之间随机一个常数,防止同一秒不同用户上传文件重复,并最终用md5函数生成哈希散列命名文件。
$filename = md5(time()+rand (1,10000)).".".$FilenameExt;
move_uploaded_file ($_FILES["upfile"]["tmp_name"], "upload/" . $filename);
echo '文件上传成功,保存于:upload/' . $filename . "\n";
}
?>

变量覆盖

大概有两种情况,第一种register_globals,第二种人为变量覆盖,register_globals= On 的时候,传递过来的值会被直接设置为全局变量使用,而Off的时候,我们需要到特定的数组里去得到它。另一种就是人为变量覆盖

<?php
$id = '0';
extract($_GET);
if($id==1){
echo "private!";
}else{
echo "public!";
}
?>

register_globals php4 默认开启 php5 默认关闭浅谈PHP代码入门审计

自动化审计工具

在源代码的静态安全审计中,使用自动化工具代替人工漏洞挖掘,可以显著提高审计工作的效率。学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。其中三款比较实用的工具:RIPS、VCG、Fortify SCA。

  • RIPS是一款开源的,具有较强漏洞挖掘能力的自动化代码审计工具。它使用PHP语言编写的,用于静态审计PHP代码的安全性。
  • VCG(VisualCodeGrepper),是一款支持C/C++、C#、VB、PHP、Java和PL/SQL的免费代码安全审计工具。它是一款基于字典的检测工具,功能简洁,易于使用。
  • Fortify SCA(Static Code Analyzer)是由Fortify软件公司(已被惠普收购)开发的一款商业版源代码审计工具。它使用独特的数据流分析技术,跨层跨语言地分析代码的漏洞产生,目前支持所有的主流开发语言。

 


T1op|T1op.com , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明浅谈PHP代码入门审计
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 1
    WEB-INF\web.xml2017-09-12 11:04 回复
  2. 1
    12017-09-12 11:06 回复