第53天-代码审计-TP5 框架及无框架变量覆盖反序列化(待续)

思维导图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRQXubax-1650602498323)(image53/0.png)]

漏洞关键字:

SQL 注入:
select insert update mysql_query mysqli 等
文件上传:
$_FILES,type="file",上传,move_uploaded_file()
XSS 跨站:
print print_r echo sprintf die var_dump var_export 等
文件包含:
include include_once require require_once 等
代码执行:
eval assert preg_replace call_user_func call_user_func_array 等
命令执行:
system exec shell_exec `` passthru pcntl_exec popen proc_open
变量覆盖:
extract() parse_str() importrequestvariables() $$等
反序列化:
serialize() unserialize() __construct __destruct 等
其他漏洞:
unlink() file_get_contents() show_source() file() fopen()
通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER 等

功能点或关键字分析可能存在漏洞
抓包或搜索关键字找到代码出处及对应文件
追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试

演示案例:

Metinfo-无框架-变量覆盖-自动审计或搜索

#变量覆盖配合文件包含实现任意文件包含
自动审计或搜索关键字找到文件及代码段,全局配置文件
搜索或访问触发全局配置文件配合手写代码测试变量覆盖
配合文件包含漏洞覆盖指定文件实现文件包含攻击获取权限
追踪$module 变量出处文件,然后分析如何覆盖它达到目的
Payload:/about/index.php?fmodule=7&module=1.txt
变量覆盖

文件导入Seay后可以用“自动审计”对程序进行一个简单的分析,其他工具也有该功能

自动审计提示“/include/common.inc.php”中有“$$”可能存在变量覆盖漏洞,从目录和文件名推断该文件应该是配置文件

变量覆盖漏洞一般先看配置型文件,因为配置型文件会被其他文件包含、使用,有利于排查漏洞

在“/include/common.inc.php”的一处遍历中,将数组“array(_COOKIE,_POST,_GET)”的键值依次赋给“$_request”,比如“$_request”等于“_COOKIE”,那么“$$_request”也就等于“$_COOKIE”

上述函数可以接收参数的键值,使变量名等于参数名,导致变量覆盖,换言之,该函数可以接收对任意变量的赋值

所有包含该代码的页面都存在变量覆盖漏洞,只需再找到可控变量就可以利用漏洞

这里选择配合文件包含漏洞进行利用,查找关键字“include_once”,发现文件“/about/index.php”存在可控变量“$module”

查看代码发现“/about/index.php”包含“/include/module.php”,该文件又包含/include/common.inc.php”,漏洞存在

搜索可控变量“$module”,了解到控制该变量需要fmodule=7,构建Payload“192.168.0.101.9009/about/index.php?fmodule=7&module=1.txt”

后续只需要上传一个任意格式的后门文件代替“1.txt”即可 

phpmydmin-无框架-反序列化-自动审计或搜索

#反序列化
自动审计或搜索关键字找到文件及代码段
__wakeup() //使用 unserialize 时触发
__sleep() //使用 serialize 时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发
找到__wakeup()代码段,代码段调用函数中存在 eval 等函数操作,可调式 load
构造 getSource()利用 Payload,实现 file_get_contents 函数配合 eval 执行
Payload:action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"d:/test.txt";}
搜索关键字“unserialize”,发现“set.php”使用了该函数,使用unserialize()时会自动触发对象的__wakeup()

查看代码发现“set.php”创建了一个“$PMA_Config”对象,找到对象的声明,再找到对象的“__wakeup()”方法

读代码发现“__wakeup()”下的“load()”函数使用了“eval()”“file_get_contents()”函数,存在文件读取操作

为了触发反序列化漏洞需要访问set.php,并POST“configuration”“action”两个参数,其中“action”不等于“clear”,“configuration”则等于序列化的“$PMA_Config”对象,对象的值为“test.txt”

构建Payload:“127.0.0.1:8081/phpmyadmin2/scripts/setup.php”Post“action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"d:/test.txt";}”

将test.txt替换为需要的文件,可以配合其他漏洞利用该漏洞 

Thinkphp5-有框架-搭建使用入口访问调试 SQL 等

#Thinkphp5 简要知识点
入口文件,调试模式,访问路由,访问对应,内置安全等
测试访问不同方法名,不同文件不同方法名
测试常规写法 SQL 注入,TP5 规定写法 SQL 注入
现在TP5最为常见,以前则是3.23

使用PHPstudy搭建TP5时,网站目录指向public文件夹

搭建好TP5打开网页会显示“:) ThinkPHP V5”

入口文件位于“public/index.php”,默认为“APPlication”,可以修改,通过修改“APP_PATH”的值实现

URL访问格式“http://domainName/index.php/模块/控制器/操作”,其中“模块”指目录名,“控制器”指PHP文件名,“操作”指函数名

地址中的“index.php”可加可不加

“APPlication/ index/controller”目录下,有默认自带测试页面“Index.php”,访问地址为“http://domainName/index.php/index/index/index”,“controller”未体现在地址中

通过GET传参x=1,可以是“地址/x/1”,也可以是“地址?x=1”

访问数据库除了一般的写法外,还有一种写法“db(‘users’)->where(‘id’,$id)->select();”,其效果等于“$sql=”select * from injection.users where id=$id;”,但是Seay无法监控其SQL语句,该写法也可以避免一部分SQL注入

调试模式开启:打开“APPlication/config.php”,将“应用调试模式”和“应用Trace”都改为“true”,再次打开网站,右下角会有调试模式开关,可以监控SQL语句 

TP漏洞的两点方向

Thinkphp的写法:查找这个版本有无漏洞

自定义的写法:常规的漏洞挖掘

涉及资源:

ThinkPHP5.1完全开发手册(PDF版)

TP5.0手册(PDF版)

ThinkPHP-Vuln(关于ThinkPHP框架的历史漏洞分析集合)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值