目录
- 演示案例:
- Metinfo-无框架-变量覆盖-自动审计或搜索
- phpmyadmin-无框架-反序列化-自动审计或搜索
- Thinkphp5-有框架-搭建使用入口访问调试SQL等
演示案例:
Metinfo-无框架-变量覆盖-自动审计或搜索
变量覆盖会直接覆盖原始变量,来形成新的变量值
搜索关键字或者自动审计,自动审计能帮助我们对程序快捷的进行漏洞分析,这些是简单报告,具体有没有漏洞是有待查询的,他是建立一下代码中可能存在的安全问题,forty也是可以做这个事情的
我们可以通过自动审计发现有些变量覆盖的东西,通过文件名可以判断出这个文件是网站程序开发里面的配置性文件,而且是在Include目录,在代码挖掘审计的过程中,像文件目录和文件名,你是要有一定的理解支持的,admin后台目录,Install安装目录,include配置性文件目录
一般优先看配置性文件,因为程序在运行过程中,他一般会包含配置性文件,如果不包含配置性文件很多功能就操作不了,我们优先看那个文件是比较关键的,我们不可能每个都看到,一般是看配置性文件多一些,配置性文件在程序中扮演的角色会更多一些,基本上很多文件都会包含配置性文件,就好比我们的数据库配置文件一样,如果不包含数据库配置文件,就无法去和数据库配置文件里面数据的连接进行操作,你包含他,你才能进入数据库的查询,因为你要执行sql命令的话,首先你要建立连接,再就是操作数据库,数据库配置文件是单纯的配置好数据库的信息,然后建立连接,你不包含数据库配置文件,你在代码中你还要先连接数据库,这样很麻烦,所以一般的话,这种配置性文件,很多文件在操作的时候,都会包含,因为包含之后就意味着执行了这些文件,里面的代码相当于共同享有
foreach函数,数组的遍历,遍历里面的_COOKIE、_POST、_GET,然后给request,这个就是php里面传参的写法,典型的传输方式
从这串代码理解的话是把值给了value,然后value给到$$_key
get、post、cookie,接收数据进行变量覆盖
这串代码在common. inc. php这里,这时候谁包含common. inc. php,那就表示谁享有这里面的代码,我们通过全局搜索查一下
我们打开首页文件,他包含common. inc. php文件
这个是我自己在下面写的代码
首页形式显示页面html的结果
我们先把原有变量index进行输出,变量index是数组,执行是引用index.html进行显示的
在.php里面把变量申明一下,然后在.html把值输出
执行一下
变量参数会直接覆盖原始变量的值,就是原有test等于xiaodi,我通过地址上输入test=122222,就会把原有xiaodi值进行覆盖掉,所以你的值就会变成我定义好的值,其实这个操作表示你原有的变量值我能进行更改,这就是变量覆盖
接收变量名=参数名,然后实现覆盖,接收get post cookie传递方式,你的参数名是什么,他的变量值就是什么
我们访问这串地址的时候,由于是以get方式发送的,get方式取这个值的时候,由于是两个$符
,相当于request接收的是$test
变量覆盖可以配合文件包含,进行攻击,他能覆盖变量,如果说一个参数进行文件包含的时候,文件包含里面有变量,可能这个变量默认等于1的,我能实现把这个变量进行覆盖,让他等于另一个值,就可以实现包含任意文件实现攻击,由于我们知道文件包含漏洞,是可以包含文件,包含一句话后门,所以它是直接跟网站权限挂钩的一种漏洞攻击,我们选择文件包含因为它最直接,利用变量覆盖可以配合其它漏洞,但是其它漏洞不一定直接跟网站权限挂钩,所以我们采用最直接、最暴力的文件包含漏洞,比如说他以前是include包含1.php,这个1.php是他指定的值或变量,你把他的变量覆盖掉
调用common.inc.php,由于common.inc.php接收数据的时候,存在变量覆盖,所以我们能覆盖变量file,实现变量file的值由我们控制,包含任意文件,由于文件包含漏洞不需要指向文件后缀。一个图片带有后门,就能包含图片里面的后门,实现攻击
我们搜索带有文件包含的函数
这里面的包含文件没有变量指定,所以我们不能更改包含的对应东西,我们要找到既有包含函数,另外这个函数包含的文件带有可控变量在里面,我们再去覆盖原始变量值,来实现包含
这个地方符合文件包含产生条件
1.php包含2.php,然后2.php包含3.php,那么1.php就会包含3.php,因为我们知道包含会相辅相成的
index.php包含module.php,module.php包含common.inc.php,所以index.php包含common.inc.php
文件包含漏洞是跟变量覆盖搭配使用的
我们要看一下module是怎么接收到的,原有变量是多少,我们追踪一下,打开module.php文件
如果fmodule不等于7,就按照数据来,由于代码包含module文件,就按照module正常运行,我们让fmodule等于7,就跳到二次循环
我们现在访问地址,把原始的fmodule值进行更改,我们要让他不等于1,跳到module.php文件循环,我们让fmodule等于7,进行循环,然后1.txt是about里面的内容
只要有一个文件上传到网站目录,就能实现getwebshell,包含文件会把任意代码当中php代码执行,不需要格式,只要里面有php代码,就能执行出php代码效果
变量覆盖可以配合sql注入,这个id值假设设置好,或者这个id值有过滤,我们把id给覆盖掉,id可控,把id覆盖成$id
='1 union select ',一拼接,就是变量覆盖导致的sql注入,只要说sql语句有变量,都可以利用变量覆盖搭配使用,来实现攻击
看个例子,dedecms 变量覆盖sql注入
变量覆盖就是覆盖原始变量,具体我们要搭配一些漏洞使用,文件包含、sql注入都可以
phpmyadmin-无框架-反序列化-自动审计或搜索
phpmyadmin数据库管理的web接口,他不是一套网站程序,他是用来管理数据库的第三方接口,很多网站都会套用他,像我们使用的宝塔、phpstudy,phpmyadmin属于插件类的
反序列化漏洞产生是有关键字
#反序列化
自动审计或搜索关键字找到文件及代码段
_wakeup() //使用unserialize时触发
_sleep() //使用serialize时触发
destruct() //对象被销毁时触发
_ca11() //在对象上下文中调用不可访问的方法时触发
_callStatic() //在静态上下文中调用不可访问的方法时触发
_get() //用于从不可访问的属性读取数据
_set() //用于将数据写入不可访问的属性
_isset () //在不可访问的属性上调用isset ()或empty()触发
_unset () //在不可访问的属性上使用unset ()时触发
_toString() //把类当作字符串使用时触发
_invoke() //当脚本尝试将对象调用为函数时触发
由于这里使用unserialize参数,会触发wakeup()对象里的魔术方法
创建PMA_Config()对象,我们查一下这个对象
这里是它申明的原始地方,class,以上只有关键字,所以我们看这里
申明对象会涉及到魔术方法,由于他这里采用unserialize函数,会默认调用PMA_Config()对象里面的wakeup()魔术方法
filemtime文件时间,getSource接收文件名,load载入源码,s变量接收的就是get值
getSource的作用取source,对象里面默认为空,我们在调用source时可以传参
看一下Load函数,eval会把里面的东西当做代码执行
file_get_contents进行文件的读取,读取操作由getSource指定
找到_wakeup()代码段,代码段调用函数中存在eval等函数操作,可调式load
构造getSource()利用Payload,实现file_get_contents函数配合eval执行
Payload: action=test&configuration=0:10:“PMA_Config”;1:{s:6:“source”,s:11:“d:/test.txt”;}
输出s变量,调用getSource函数
调用unserialize参数给的是configuration,我们执行一下
Thinkphp5-有框架-搭建使用入口访问调试SQL等
入口文件,调试模式,访问路由,访问对应,内置安全等
测试访问不同方法名,不同文件不同方法名
测试常规写法SQL注入,TP5规定写法SQL注入
现在在市面上tp5开发框架是最多的,不同版本,他的知识点是一样的,只是每个版本跟新之后,有些写法有些小区别,框架是都一样的
这是他默认框架打开的页面
application默认存在的目录
入口文件可以默认也可以自定义,他指向的是application,就是说入口文件是application目录
这个代码段是首页显示代码
我们访问后台代码函数
我们要挖掘tp5网站漏洞,访问网站对应文件,查看代码,是必须要掌握的
调用xiaodi方法,并且给i传值,就是说要控制x的传参值
这个也可以
这个是我们自己写的清晰明了的数据库查询语句,我们用监控语句看一下
这个语句被执行了
一般thinkphp有它自身的规矩写法,就是官方的写法
下面这串代码就是典型的thinkphp写法
db是数据库名,where条件语句,select调用select查询
我们执行
执行完之后,抓sql语句,抓不到,他是没有被监控到的,这就跟我们前边讲到的预编译查询有点类似
更改配置文件,把这两个开关更改为true,打开调式模式
我们在访问网站会发现,浏览器右下角会出现图标,从这里就会监控到sql语句,所以我们不用插件去监控了
直接从这里监控,可以看到这里会返回当前访问信息,对应加载那些文件,还可以看看流程,这个调式模式类似断点调式,可以看到他的错误信息和执行的SQL语句
可以看到我们访问地址的时候,执行的sql语句,我们输入的注入测试语句,没有执行,压根就没有作用
thinkphp推荐你写这个写法,他是有自带的过滤,就是他的内置安全
如果一个采用thinkphp开发的网站,他按照thinkphp官方的写法去写,我们挖的是thinkphp自身的漏洞,因为他的写法是按照thinkphp的,所以你针对的就是thinkphp
这种框架类开发的网站,按照推荐写法去写的话,如果你挖掘程序漏洞就是挖掘对应框架漏洞,有人引入框架并不代表任何代码都是按照框架写的,程序员在开发框架源码的时候,他有些地方,他是按照自己写法写的,那这个就不是thinkphp的问题了,那就是按照常规代码来分析,如果是按照thinkphp写法写,那就要针对thinkphp自身的过滤来研究了,这个就比较困难,那就是找thinkphp自己框架漏洞
一些前期的知识点是必不可少的,我们要知道怎么去访问代码段或者去调用他
采用thinkphp框架写法,我们应该采用两种方法去分析去挖掘里面的漏洞,看他的写法,如果写法自身是thinkphp的写法,那么我们就要查询这个版本的thinkphp框架有没有漏洞
如果他自身是用自定义的写法,那就是常规的漏洞挖掘,只是说他建立的是thinkphp,所以我访问和查看文件,找到对应文件,这个有点相关的区别而已,其它的都是一样的
这个网站就是典型的thinkphp开发网站
我们打开程序源码,这个目录跟我们thinkphp目录基本一样
一般index.php这里默认可加可不加的
先看入口文件,找到他的index.php文件
对应着去找文件
有时候你编码没有搞对,不是你修改的问题,他直接访问就有问题
用phpstorm打开,这是mvc结构
修改页面的每一关,就是修改这个地方
修改功能就是修改控制器这里,所以这就是mvc整体项目、文件和这些东西的一些分布
如果我要挖掘漏洞就载入程序进行全局搜索
sql的自定义写法,我们要去找自定义写法的地方,因为自定义写法,没有受到官方的保护,同样上传也是一样的,所以它的挖掘思路和我们常规的挖掘思路是一模一样的
如果采用的是官方的,搜索thinkphp官方版本有没有出现漏洞,在说明文件里面看,也可以在配置文件里面调置输出一下
可以搜索thinkphp历史漏洞
https://github.com/Mochazz/ThinkPHP-Vuln