欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代码审计篇入门

程序员文章站 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=后面的语句

参考:https://www.cdxy.me/?p=756

<?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()

代码审计篇入门

参数白名单限定某些参数










相关标签: 代码审计