目录

一、PHP的特性

1.弱类型

(1)简介

(2)实例1

(3)实例2

2.PHP反序列化漏洞

实例1:

3.截断漏洞

4.伪协议

5.变量覆盖

(1)函数使用不当

A.extract函数

B.parse_str函数

C.import_request_variables函数

(2)配置不当

(3)代码逻辑漏洞

6.防护绕过

二、windows系统特性

1.短文件名

2.文件上传


在不同的环境之下,相同的代码可能带来不一样的实现效果,对于开发人员来说,不同的环境应该写出兼容性更好的代码,对于安全人员来说,利用环境,也可以让一行普通的语句变成漏洞。

一、PHP的特性

1.弱类型

(1)简介

在PHP中有一些相等的值:

在PHP中,比较两个值是否相等,可以用“==”或者“===”两种符号,前者会在比较的时候自动进行类型转换,而不是改变原来的值,所以存在漏洞的位置往往是“==”,其中的一个常见错误用法就是:

这个时候,如果input变量的值为labc,则比较的时候labc会被转换为1,if语句的条件满足,进而造成其他的漏洞,另一个常见的场景是在运用函数的时候,参数和返回值经过了类型转换造成漏洞。

(2)实例1

如何才能满足下面这样一个if判断语句?

需要使两个变量不相等而MD5值相等。这样的思路可以通过MD5碰撞的方法来解决。对于PHP来讲,MD5的返回值是一个32位的字符串,若这个字符串以“0e”开头,类型转换机制将会把它识别为一个科学计数法表示的数字“0”,下面给出两个MD5以0e开头的字符串

aabg7XSs=0e087386482136013740957780965295

aabC9Rqs=0e041022518165728065344349536299

提交这两个字符串即可绕过

(3)实例2

如果上面的“==”变成了“===”就不能成功了,但是仍然可以利用PHP的特性来进行,可以在URL栏中提交a[]=1&b=[]=2成功绕过,因为当我们令MD5函数的参数为一个数组的时候,函数会报错,并返回NULL值,虽然函数的参数时两个不同的数组,但是返回的值都是NULL。

同样是在程序返回值中容易判断错误的函数还有很多,如:strpos,见PHP手册

这也是一种经常能见到的写法,当str1在str2开头时,函数的返回值是0,而0 == false是成立的,这就会造成开发者逻辑之蛙的结果。

2.PHP反序列化漏洞

PHP提供的serialize和unserialize函数将任意类型的数据转换成string类型或者从string类型还原成任意类型。当unserialize函数的参数被用户控制的时候就会形成反序列化漏洞。

与之相关的是PHP语法中的类,PHP的类中可能会包含一些特殊的函数,名为magic函数,magic函数的命名方式是以符号“——”开头的,比如:_construct、_destruct、_toString、_sleep、_wakeup等。这些函数在某些情况下会被自动调用。

为了更好的理解magic函数时如何工作的,我们可以自创一个PHP文件,并在其中增加magic函数:_construct、_destruct、_toString。_construct在对象创建时被调用,_destruct在PHP脚本结束时被调用。若我们在反序列化的时候加入一个类,并控制类中的变量值,那么结合具体的代码就能够执行magic函数里的危险逻辑。

实例1:

页面的功能是从cookie中反序列化过后的对象打印出来的,这样,_toString()函数就会在打印的时候被调用,在本地生成filelist对象的时候,可以将scouce变量的值设置为想要读取的文件名,序列化后再提交即可,生成的序列化字符串的代码如下:

将打印出来的字符串作为参数提交,即可读取/ect/psswd文件。

如果代码量复杂,使用了大量的类,需要构造ROP链来来进行利用。

3.截断漏洞

NULL字符截断是最有名的截断漏洞之一,原理是:PHP内核是有C语言实现,因此使用了C语言中的一些字符串来处理函数,在遇到NULL(\x00)字符时,处理函数就会将它当做结束标记,这个漏洞能帮助我们去掉变量结尾不想要的字符,代码如下:

按照正常的程序逻辑来说,这段代不能直接包含任意文件,但是在NULL字符的帮助下,我们只需要提交:

即可读取到psswd文件。与之类似的是利用路径的长度绕过,比如:

系统在处过长的路径时会主动选择截断他,不过这两个漏洞已经随着PHP版本的更新而消失,遇到这种情况会越来越少,另外造成截断的方法就是不正确地使用icov函数:

在遇到file变量中包含非法字符UTF-8字符的时候,iconv函数就会截断这个字符串。

在这个场景之中,我们只需要交“?file=shell.jpg%ff”即可,因为在UTF-8字符集中单个“\x80-\-xff”都是非法的,这个漏洞只在windows系统中存在,在新版本的PHP中也已经得到修复。

4.伪协议

截断漏洞在新版本的PHP中难以实现,但是我们能通过伪协议去绕过,但是这种情况只适用于我们能控制include指令参数的前半部分的时候,若在php.ini的设置中让allow_url_include=1,即允许远程包含的时候,我们可以令参数为:

这样,PHP服务会从攻击者的服务器上取得shell.jpg并包含,如果我们能上传自定义图片的话,那么我们可以将webshell改名为shell.php并压缩成zip上传,然后再利用zip协议包含:

这样即可包含到shell,与zip协议效果相同的还有phar协议。

除此之外,我们还能通过伪协议读取到部分文件,在上面的例子中,如果服务器上有一个index.php,那我们可以令参数为:

然后,就能在页面中得到index.php文件源码base64编码后的字符串了。

5.变量覆盖

变量覆盖漏洞通常是使用外来参数替换或初始化程序中原有变量的值。

(1)函数使用不当

A.extract函数

考虑代码如下:

此处的extract函数GET传入的数据转换为变量名和变量的值,所以这里构造如下payload,即可将$auth的值为true并获得flag:

B.parse_str函数

考虑如下代码:

此处的parse_str函数同样也是将GET转入的字符串解析为变量,所以payload与上方的extract函数的payload一样。

C.import_request_variables函数

此处,import_request_variables函数的值由G、P、C三个字母组合而成,G代表GET,P代表POST,C代表Cookies。排在前面的字符会覆盖排在后面的字符传入参数的值,如,参数为“GP”。且GET和POST同时传入了auth参数,则POST传入的auth会被忽略。需要注意的是,这个函数自PHP4.5起就被移除了。

(2)配置不当

在PHP版本号小于5.4的时候,还存在配置问题导致的全局变量覆盖漏洞。当PHP配置register_globals=ON时,便可能出现该漏洞,考虑如下代码:

利用register_globals的特性,用户传入参数auth=1即可进入if语句块。需要注意的是,如果在if语句前初始化$auth变量,则不会触发变量。

(3)代码逻辑漏洞

在讲述代码逻辑漏洞导致的变量覆盖之前,需要大家先来了解在PHP中的$$(可变变量)。可变变量可以让一个普通变量的值作为这个可变变量的变量名,可以参考一下代码:

在新版本PHP移除了前面提到的import_request_variables函数和register_globals选项之后,开发者会选择使用foreach遍历数组(如,$_GET、$_POST)来注册变量,这样也会存在变量覆盖漏洞的情况,考虑如下代码:

此处的foreach循环就将GET传入的参数注册为变量,所以与前面一样,传入“?auth=1”,即可绕过判断flag。

6.防护绕过

主要的用到的防护手段,分别是:open_basedir和disable_function

open_basedir是PHP设置中为了防御PHP跨目录进行文件(目录)读写的方法,所有PHP中有关文件读、写的函数都会经过open_basedir的检查。

常见的绕过方法有DirectoryIterator+Glob,目前最新版本的PHP中,官方还没有修复这个问题。测试代码如下:

二、windows系统特性

1.短文件名

windows以8.3格式生成了与MS-DOS兼容的“短”文件名,以允许基于MS-DOS或16位windows的程序访问这些文件,在cmd下输入“dir/x”即可看到段文件名的效果。

在windows下的apache环境里,我们除了能爆破服务器文件,还能通过短文件直接下载长文件。

2.文件上传

另一个与文件系统相关的功能就是,上传的时候若以黑名单的形式限制后缀,那么我们可以利用文件系统的特性去绕过,比如一下代码:

在这段代码中,我们不能上传后缀名为php的文件,但是如果我们在上传的时候在PHP的后面追加高位字符[\x80-\xff],这样就可以绕过黑名单的判断而上传成功,上传的文件后缀会去掉[\x80-\xff],与高位字符具有相同效果的还有::$data,后者是利用:$DATA Alternate Data Stream。

在windows下面一个特殊符号是冒号,如果我们上传的时候将后缀改为.php:.png形式,那么在系统中最后得到的讲师0字节的php后缀文件,也就是说起到了截断的效果,但是没能成功写入内容。

《CTF特训营》——利用特性实现的攻击相关推荐

  1. 【CTF特训营】 Reverse篇 2.Reverse分析

    关键代码定位 1)API断点法 2)字符串检索法 快捷键 说明 Ctrl+F IDA中查找字符串 Alt+E 在Olldbg中查找主模块 3)辅助工具定位 常见加密算法识别 对数据进行变换的时候经常会 ...

  2. 《CTF特训营》——跨站脚本攻击(XSS)

    一.基本介绍 跨站脚本攻击简称XSS,是一种网站应用程序漏洞,是代码注入漏洞的一种,攻击者可以通过这个漏洞向网页中注入恶意代码,导致用户浏览器加载网页.渲染HTML文档时执行攻击者代码. 二.分类 1 ...

  3. 《CTF特训营》——古典密码学

    目录 一.移位密码 1.简单移位密码 (1)介绍 (2)例子 (3)加密解密的实现 2.曲路密码 3.云影密码 4.栅栏密码 二.代替密码 1.单表代替密码 (1)凯撒密码 ①加密解密的实现 ②例子 ...

  4. 【CTF特训营】 Reverse篇 1. 概述

    1.逆向分析的主要方法 1.静态分析法:不执行代码文件的情形下,对代码进行静态分析的一种方法,包括文件类型分析,静态反汇编,反编译. 2.动态分析法:使用调试器动态分析 2.汇编指令体系结构 1.X8 ...

  5. dparsf是什么_回顾:第五届DPABI/DPARSF特训营暨DPABISurf加强营

    附:第五届DPABI/DPARSF特训营暨DPABISurf加强营回顾 第/五/届/特/训/营/合/影 2019年7月20日至7月22日,第五届DPABI/DPARSF特训营暨DPABISurf加强营 ...

  6. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结

    这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...

  7. 字节跳动青训营--前端day7

    文章目录 前言 一.Node.js 的应用场景 (why) 1. 前端工程化 2. web服务端应用 3. Electron跨端桌面应用 二.Node.js 运行时结(what) 1. V8 ,lib ...

  8. matlab hist函数_算法工匠MATLAB专训营:Matlab绘图,小试牛刀

    作者 | 蔡老师 仿真秀专栏作者 首发 | 仿真秀平台 导读:正文之前,我在此详细说明一下,因为本文包含的程序太难得,网上肯定找不到这样的程序.随着讲课的越来越深入,我给出的程序会越来越实用,接近于实 ...

  9. Qtum量子链帅初受邀火星特训营面对面授课

    9月16日.17日,火星特训营首期第三次课程在京进行,Qtum量子链联合创始人帅初受邀担任火星特训营区块链导师之一为36位特训营学员分享了自己对于区块链技术的独到见解.一同担任明星导师还有薛蛮子.冯波 ...

最新文章

  1. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定
  2. 【cocos2d-js官方文档】九、cc.loader
  3. 【jQuery】使用Ajax提单表单数据
  4. 使用DSX-5000 对已安装的电缆进行故障排除
  5. openstack资源使用汇总_OpenStack 如何查看主机已使用的资源啊?
  6. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_漏洞公告 | 华硕(ASUS)家庭无线路由器远程代码执行0day...
  7. oracle数据库自动备份脚本
  8. LG 源代码或被盗,如何才能毫发无损地要回来?
  9. 数据结构和算法详解(二)——线性表(数组、链表、栈、队列)
  10. 怎么对ChannelHandler做测试?
  11. 伍德里奇计量经济学第三章课后计算机作业,伍德里奇---计量经济学第7章部分计算机习题详解(STATA)...
  12. 人机工程学/人因工程学的定义
  13. HDB3码的编码解释(简单粗暴)
  14. Matlab 口罩识别
  15. 《近匠》 | 探索一站式智能硬件开发的最佳解决方案
  16. 行业分析-全球与中国无线键盘和蓝牙耳机市场现状及未来发展趋势
  17. 业务异步写mysql数据库_把重要的业务日志异步批量写入数据库
  18. Win7 设置防火墙开放特定端口
  19. hadoop是什么语言
  20. IIC总线随机读VHDL实现FIFO实现乒乓操作HM62256测试定制IP核

热门文章

  1. windows server 2016 配置DHCP
  2. prefetch 和preload_在webpack中使用prefetch/preload
  3. 用计算机绘制工作表,如何用电脑做表格?
  4. coc-lua安装报错解决办法
  5. 用matlab对基带信号进行调频,(很实用很好)用MATLAB实现信号调制与解调调频调相等.doc...
  6. 异步编程-Future
  7. java中having的意思,Having 的用法(转)
  8. 解决Fegin请求远程微服务时有几率出现时间解析异常: through reference chain: xxx->xxxDto[“xxxTime“]
  9. 微型计算机评测室,上网平台大对决
  10. iOS系统设置粗体文本后UIButton的宽度错误