前言
- 代码审计工具 thankphp 5.0.x exp
https://www.feelingshome.cn/index.php&width=1280&height=720
蚁剑相连->虚拟终端->whoami->id - url:
协议://IP地址或域名:端口/访问资源路径/访问资源?变量1=值1&变量2=值2 - thinkphp框架访问格式:
协议://IP地址或域名:端口/public/index.php/控制器名、方法名/方法参数名/参数值
代码审计介绍
什么是代码审计?
顾明思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或人工审查的方式。
(代码审计环境phpstudy)
自动化代码审计?
RIPS
Seay
VCG
RIPS:
- 它是一款开源的,具有较强的漏洞挖掘能力的自动化代码审计工具,由PHP语言编写,用于静态审计PHP代码。
- 也可以采用正则方式扫描代码发现漏洞;还能够采用自定义的语法扫描代码发现问题。
RIPS的下载和安装
官网:http://rips-scanner.sourceforge.net/
解压下载的zip文件到Web服务器网站目录下即可。在浏览器中输入Web服务器地址和对应目录
主界面介绍
- path/file: 要扫描的目录
- subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选
- verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)
- vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描
- code style:选择扫描结果的显示风格(支持9种语法高亮)。
- /regex/:使用正则表达式过滤结果
- scan: 开始扫描
实践:
- 在路径处输入要扫描的源代码文件夹地址,然后点击scan,稍等一会就会出现全部结果,并以图表的方式弹出一个总结的结果页面。
- 然后我们看报告
- 点击每一个代码块左上角的书页小图标,就会展开这个代码的详情
- 点击每一个代码块左上角的红色小图标,可以生成漏洞的利用代码
- 点击每一个代码块左上角的问号小图标,就会展开这个漏洞的详情、原理
- 同样,问号中还有漏洞的解决方案和更安全的范例代码书写方法
Seay:
由阿里巴巴尹毅使用C#开发的针对PHP代码安全审计软件。
运行在windows系统。
执行审计常见web安全漏洞,并且能够进行代码调试,函数定位,语法高亮等。
实践:
新建项目,打开源码文件夹,点击自动审计即可
误报可能会过多,扫描完成生成报告即可查看
VCG:
VCG是一个基于字典的自动化源代码扫描工具,可以由用户自定义需要扫描的数据。它可以对源代码中所有可能存在风险的函数和文本做一个快速的定位
下载地址:http://sourceforge.net/projects/visualcodegrepp/
双击msi文件进行安装即可
- 在Settings->Options->ConfigFiles选项中可以对每种语言的扫描配置文件进行编辑
- 点击Settings选项,选择扫描的目标语言类型。点击File->New Target Directory选项,选择需要扫描的源代码文件存放目录,点击Scan->Full Scan选项,扫描开始
- 我们重点关注Results和Summary Table两个面板显示的内容
Results面板显示所有存在安全风险的源码,右键点击可以对结果进行排序过滤 - Summary Table面板是对Results面板内容的总结展示
代码审计思路思维
代码审计思路
1、逆向追踪,或叫回溯变量
- 一般是检查敏感函数的参数, 然后回溯变量, 判断变量是否可控并且没有经过严格的过滤, 这是一个逆向追踪的过程
- 优点 : 只需要搜索相应敏感关键字, 即可以快速地挖掘想要的漏洞, 具有可定向挖掘和高效, 高质量的优点
- 缺点 : 由于没有通读代码, 对程序的整体框架了解不够深入, 在挖掘漏洞时定位利用点会花费一点时间, 另外对逻辑漏洞挖掘覆盖不到
2. 正向追踪,或叫跟踪变量
- 先找出哪些文件在接收外部传入的参数, 然后跟踪变量的传递过程, 观察是否有变量传入到高危函数里面, 或者传递的过程中是否有代码逻辑漏洞,这是一种正向追踪的方式, 这样的挖掘方式比逆向追踪挖掘得更全,但可能没有逆向追踪快
3. 直接挖掘功能点漏洞
- 根据自身的经验判断该类应用通常在哪些功能中会出现漏洞, 直接全篇阅读该部分功能代码
- 黑盒+白盒测试
- 系统重装
- 文件上传
- 文件管理功能
- 登录认证
- 密码找回
- 订单支付
4.通读全文
通读全文的方法
- 入口点->index 文件, index是一个程序的入口文件, 所以通常我们只要读一读index文件就可以大致了解整个程序的架构, 运行的流程,包含的文件, 建议最好先将几个核心目录的index文件都简单读一遍
- 函数集文件, 一般在index文件中都会包含函数集文件, 通常命名为functions, common等关键字,
这些文件里面都是一些公共的函数, 提供给其他文件统一调用。 - 配置文件, 通常命名中包括config 关键字,里面包含一些功能性配置选项以及数据库配置信息, 还可以注意下参数值是用单引号还是双引号,如果是双引号, 则很可能会存在代码执行漏洞; 还需要关注以下数据库编码。
- 安全过滤文件, 文件过滤文件对我们做代码审计至关重要, 关系到我们挖掘到的可疑点能不能利用, 通常命名中有 filter, safe, check 等关键字, 这类文件主要是对参数进行过滤。
- thinkphp 、yii 、xdebug 、 跟踪调试
- 优点 : 可以更好地了解程序的架构以及业务逻辑, 能够挖掘到更多, 更高质量的逻辑漏洞, 一般老手会喜欢这种方式。
- 缺点:就是花费的时间比较多, 如果程序比较大, 读起来会比较累。
文件操作漏洞:
- 能不用文件名参数就不用 尽量不要让用户可控
- 平行用户的权限 管理员的权限 操作权限
- 禁止传入参数类似于这种 … ,/,\ 检查传入的参数,做出限制,停止程序往下执行
本地文件包含:
- 一般存在于模块加载,模板加载,cache调用
- 包括函数:include()/include_once(),require()/require_once()寻找可控变量
远程文件包含:
- 前提条件:allow_url_include = on
- 出现频率不如本地包含
文件包含截断:
- %00截断(php版本小于5.3)
- 问号截断(问号后面相当于请求的参数,伪截断) 英文(.) 反斜杠(/) 截断
文件读取(下载)漏洞:
搜索关键函数:
file_get_contents()
highlight_file()
fopen()
read file()
fread()
fgetss()
fgets()
parse_ini_file()
show_source()
file()
文件上传漏洞
搜索关键函数:
move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过
(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用
(2) 黑名单扩展名过滤:
限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。
扩展名可绕过。
不被允许的文件格式.php,但是我们可以上传文件名为1.php(注意后面有一个空格)。
(3)文件头 content-type验证绕过:
getimagesize()函数:验证文件头只要为GIF89a,就会返回真
限制$_FILES["file"]["type"]
的值 就是人为限制content-type为可控变量。
(4) 防范:
使用in_array()或 利用三等于===对比扩展名
保存上传文件是重命名,规则采用时间戳拼接随机数:md5(time() + rand(1,1000))
文件删除漏洞:
搜索关键函数:
unlink()利用回溯变量的方式
老版本下的session_destroy(),可以删除文件,现已基本被修复
Metinfo的任意文件删除漏洞:
$action = delete即可删除.sql的文件,如果文件不是sql直接删除提交的文件名
target.com/recovery.php&action=delete&filename=…/…/index.php
代码执行漏洞
代码执行函数
搜索关键函数:
eval()
assert()
preg_replace(),
call_user_func(),
call_user_func_array(),
array_map()
(1) preg_replace()函数:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]]
)
当$pattern
处存在e修饰符时,$replacement
会被当做php代码执行。
(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):
第一个参数为回调函数,第二个参数是回调函数的参数
(3)eval()和assert():
当assert()的参数为字符串时 可执行PHP代码【区分】:
动态函数执行
动态函数后门:
当assert()的参数为字符串时 可执行PHP代码【区分】:
命令执行函数:
搜索关键函数:system(),exec(),shell_exec(),passthru(),pcntl_exec(),popen(),proc_open()
(1) popen和proc_open():
所在路径就会出现一个1.txt 里面的内容为命令执行后的结果
审计一个CMS
环境:
phpstudy
bluecms源码
我们作为一个新手,最好的办法就是通读全文,熟悉架构,俗话说,适合自己的才是最好的。
Web安全重点就三个词:“输入”,“输出”,“数据流”。
很多情况下,根据命名,就可以猜出来这部分的文件具体是干嘛的了。比如admin文件夹,那么里面的文件肯定是和管理员的操作有关。Include文件夹,里面肯定包含了⼀些常用的函数文件。
简单看完目录后,要看主页的index.php,在看这个文件的同时,还要打开它的网页,做到⼀边看代码,⼀边看网页的效果。这种方法可以让我们这些对代码不熟悉的新手脑海中可以构建相
应的情景图,以后即使做渗透,也不会手足无措。
打开主页index.php,看看里面的注释,因为在Index.php里面,往往不需要获取用户输入。之所以看它,是想知道在这个主页上,会引用哪些操作文件,⼀个网站的大概样⼦是啥样子
有两种审计思路,⼀种是通过点击网页,看网页如何跳转,来追踪审计
我⼀旦点击主页上的登录按钮,那么我就会跳转到user.php中,执行act=index_login的操作。 那么这时候,我们就可以打开相关的文件,查看该操作是如何进行的即可
可以看到,先是获取了用户的输入,这里咋⼀看是好像存在漏洞,但是,当你仔细看的时候,就会发现UC_API,并且引用了client.php中的函数,看client.php中的⼀些函数时,有些也看不懂。就比如下面这个,即使我知道是将那些参数全都传入 UC_API_FUNC中,可是依旧不清楚返回值是什么类型
通过查百度,这个玩意是判断用户提交信息是否正确,然后返回正确情况下的uid
像我们初学代码审计,会有大批代码看不懂。死磕下去,才会看懂越来越多的代码。也为了以后审计逻辑漏洞打下基础。但是,也不能盲目死磕⼀个不会的点,这个度只能自己把握
Bluecms有很多漏洞,很适合我们这种刚学代码审计的进行学习,以下介绍几种常见的漏洞审计:
/ad_js.php前台sql注入漏洞
使用seay定位到/ad_js.php,里面有⼀条SQL语句,如下:
getone()是自定义的函数,用来查询数据库,代码如下:(mysql.class.php)
回到ad_js.php看下面代码:
可以看到$ad_id变量,并没有使用单引号保护,我们看一下这个变量的来源:
若通过GET获得ad_id则去除它两边的空白字符,否则为空。在获得了ad_id值后,接下来就直接将$ad_id 送入了查询语句,没有做任何过滤,因此这里存在注入
利用:
既然并没有做任何过滤,那我们就可以直接进行sql注入了,这里使用手工注入来演示
先查询字段数 /ad_js.php?ad_id=1 UNION SELECT 1,2,3,4,5,6
只有7个字段,接下来我们利用元数据报表
爆表: ad_js.php?ad_id=1 UNION SELECT 1,2,3,4,5,6,GROUP_CONCAT(table_name) from information_schema.tables where table_schema=database()#
参数介绍: GROUP_CONCAT函数返回⼀个字符串结果,该结果由分组中的值连接组合而成。 information_schema.tables表示该表所属的数据库的名称 table_schema数据库的名称
接下来爆列,爆数据查出管理员的账号密码
Md5解密为root/root
/guest_book.php(XF注入):
我们使用seay自动审计来寻找这个漏洞
检测出获取ip地址方式可以伪造,所以可以使用X-Forwarded-For和CLIENT-IP可以伪造ip进行sql注入
全局搜索ip找到guset_book.php里面有关于ip的sql语句
$online_ip就是getip()
追踪到common.fun.php中的getip()函数
使用X-Forwarded-For或者CLIENT-IP进行SQL注入
查看评论区出现sql注入结果