bugku web题总结
陆陆续续将bugku的web题刷了一大半,剩下的都是分比较高的难点的题,做题过程中遇到了很多的问题,大部分题就没离开过write up,不过还是学到了很多,因此想做一个总结。
线索收集
拿到一个ctf题的第一步就是收集信息,特别是一些隐藏的提示信息,否则会寸步难行。
常见的信息点
网页文档的DOM信息
网页注释
有些题会在网页注释中给出提示信息,比如给出一部分源码之类的。
表单标签属性
如’计算器’一题就是通过修改input
标签的maxlenth
属性得到flag。
<meta>
标签
meta常用于定义页面的说明,关键字,最后修改日期,和其它的元数据。这些元数据将服务于浏览器(如何布局或重载页面),搜索引擎和其它网络服务。
该标签会给出一些信息,某些信息如字符集编码会对做题有帮助。
body标签之外
有时候题目作者会把提示放在body标签和html标签之间,这样提示不会出现在网页页面,需要查看网页源码才能看到。
数据包
信息与提示经常隐藏于数据包的请求头与响应头中,可以使用抓包工具获取信息。
robots.txt
一般网站会有robots.txt
来规范爬虫的行为,利用robot.txt可能获取到网站的重要文件所在的位置。
备份文件
某些编辑器在编辑时会生成一些备份文件,如果不写正确处理这些文件,黑客可以利用这些文件还原源码,如:
网站备份压缩
.rar
.zip
.7z
.tar.gz
.bak
php审计(常见漏洞)
is_numeric(mixed $var)
is_numeric(mixed $var) — 检测变量是否为数字或数字字符串
有时候会需要绕过该函数的判断,可以利用科学计数法,如 1==1E+0
strip_tags(string,allow)逻辑错误
strip_tags(string,allow)——函数剥去字符串中的 HTML、XML 以及 PHP 的标签。allow可选。规定允许的标签。这些标签不会被删除.
有些代码会将该函数放在过滤代码之后,那么可以通过在payload中嵌入HTML、XML 以及 PHP 标签的方式绕过之前的过滤代码。
urldecode()逻辑漏洞
同strip_tags(),将该函数放在判断函数之后的话可通过对payload的二次url编码绕过之前的判断函数。
本地包含
eval() 函数把字符串按照 PHP 代码来执行。
var_dump() 打印变量的相关信息
show_source() 函数对文件进行语法高亮显示。
如果以上变量函数可控且未经处理,可执行恶意代码。
$GLOBALS
$GLOBALS
:是一个数组,包含了全局作用域中可用的全部变量。变量的名字就是数组的键。
合理利用$GLOBALS
全局变量也许可以获得可利用变量信息。常与var_dump()函数连用。
php://伪协议
php://filter伪协议:https://www.cnblogs.com/likai/archive/2010/01/29/1659336.html
利用php://filter伪协议可以进行文件读取
php://input 可以访问原始请求数据中的只读流。
php://伪协议可作为数据流,被使用数据流的函数执行,如file_get_contents()
php弱类型比较
ereg()或eregi()
截断漏洞
eregi(string $pattern , string $string [, array &$regs ])
不区分大小写的正则表达式匹配
ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符(%00)则截断丢弃后面的数据。
scandir(‘dir’)
scandir(‘dir’) 返回目标路径的目录数组
md5()函数漏洞 和 md5碰撞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的payload有:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
同时md5()不能处理数组,md5(数组)会返回null。
strcmp()函数漏洞
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。
也就是说我们可以通过输入数组或对象达到绕过判断的目的。
sha1()函数漏洞
sha1()函数无法处理数组类型,将报错并返回NULL
图片隐写总结
以下是关于图片隐写常见套路的总结。
隐藏于图片的基本信息中
该类题通过查看图片基本信息,可以直接获取FLAG,主要方法如下:
1.右键查看图片属性,检查图片简介、备注中是否有FLAG;
2.将图片用编辑器工具打开,如使用记事本、notepad+、winhex,检查是否包含FLAG;
多图层文件
玩CTF的大概都听过一个神器 - stegsolve,用它把图片打开,该软件也有两种用途:
1.一直按右箭头(或者左箭头),说不定就会出来一个二维码 ;
2.提取低位信息,这涉及到图片隐写的一个大类,lsb隐写,一般都藏在0,1,2这些低位里面,在软件功能选项中查看Analyse→Data Extract,逐个调试。
复合文件
CTF比赛中经常碰到png文件中复合其他文件的情况,如就是图片后面再放点压缩包、txt文档、或者再添加一张图片,具体操作方法如下:
copy /b a.jpg+b.zip c.jpg
copy /b a.jpg+b.txt c.jpg
copy /b a.jpg+b.jpg c.jpg
解题思路:通常这类图片比较大,可将图片后缀改为zip或者rar,解压即可。也可以用winhex找图片的开头结尾标志,手动分离出来,也可以使用kali下的工具binwalk或者foremost分出来;
注:比较高级点的图片隐藏图片的话,有的会把第二张图片头给去掉,然后把两张图片合在一起,这样那些提取工具就没用了,这个时候需要稍微细心点,用winhex找第一张图片的尾部,然后把第二张图片的头给加一下,再进行分离操作。
改图片高度
CTF比赛中可利用16进制编辑工具更改图片的高度,使图片只显示一部分,下面的部分被隐藏,嗯,这是个藏东西的好办法!
当以上方法均不可以得到FLAG,且图片长宽比例诡异时,可以尝试改图片大小,下面介绍找图片宽度和高度的标志位的方法:
1.对于png文件,其第二行第六列是高度位,改这一位即可;
2.对于其他格式图片,可以先看看图片的属性,得到宽高值,转成16进制数,搜索该16进制值就能找到标志位了