行业知识
XYCTF-部分web总结
这个月在XYCTF中写了部分web题,题中学到在此记录一下
ezhttp
打开就是一个简单的登录页面
f12说藏在一个地方,先想到的就是robots.txt
访问直接给账号密码
username: XYCTFpassword: @JOILha!wuigqi123$
登录后:
明显考源跳转,修改referer值为yuanshen.com
UA头检测,修改UA头为XYCTF
检测设备ip,添加client-ip: 127.0.0.1
考代理,使用XFF被ban了,换一个使用Via
Via: 该字段指示请求经过的代理服务器信息。它包含一个或多个代理服务器的名称和版本号,以及可选的注释信息。
在cookie中添加XYCTF
ezmd5
上传相同的图片抓包
发现md5一样但是areEqual是false
稍微修改一下图片内容发现areEqual为true但md5又为false
猜测大概是要一个内容不同但是md5相同的图片
资料说是可以在不修改图片内容数据下去修改md5计算部分为相同
这位篇文章就有符合条件的图片
制造 MD5 碰撞 | 米米的博客 (zhangshuqiao.org)
warm up
分析代码,首先一个很基础md5弱比较,数组绕过
val1[]=1&val2[]=2
利用弱比较科学计数法让md5加密后还是以0e开头从而达到0=0的效果
md5=0e215962017
XY不能等于这个数但是md5加密后要相等
乍一看没有办法过去,但是 XYCTF_550102591
加密后是以0e开头的,跟上一部分差不多原理
找一个md5加密后以0e开头的即可,所以总payload为
val1[]=1&val2[]=2&md5=0e215962017&XY=0e215962017&XYCTF=0e215962017
ezmake
Makefile考察,通过编写makefile项目内容去读取flag
直接给SRC赋值shell来实现系统命令执行
$SRC:=$(shell 'ls')
因为没有做任何过滤,shell的解释器也指定为/bin/bash所以直接读取flag即可
$SRC:=$(shell 'cat flag')
当然也可以利用GNU Make 的 $(file) 函数结合文件函数(file function)来读取文件的行数或某一行的内容
$SRC:=$(file
ez?make
这题明显加了过滤,通过fuzz发现过滤的字符有
f,l,a,g,$,/,?,*
没有了$就不能通过调用正常的调用函数和通配符去读取flag了
对单字母的过滤可以利用linux对大小写敏感的特性通过大写绕过
而执行命令的方法可以通过编码进行绕过我们要直到,bash执行的是二进制数据,所以只要将要执行的命令转换成二进制去执行进行了
这里先利用xxd转换和管道符传递最后用反引号来执行:
`echo 636174202F666c6167 | xxd -r -p`
牢牢记住,逝者为大
对传入的cmd进行检查最后利用eval函数执行,但是eval函数中包含的其他的字符。如果仔细看前面的字符中man前面有一个#这个是用来注释的这会注释掉拼接的cmd而不能执行。
难点一
- 长度要求cmd和?不能使用短标签阶段......
但是我们忘记了最朴实无华的方法换行截断,我们可以通过%0a或者%0d来阻断前面的字符,这样我们换行后,前面的字符就被注释掉而不当成PHP命令去执行。后面也是利用#去注释掉
这样eval的问题就解决了
最后构造外带参数时是要通过反引号去执行传入的参数,受限于长度限制,不能将执行的命令进行打印,这里可以通过将flag的内容复制到另一个文件来解决无显RCE,虽然过滤了cp但是可以利用linux特性\来绕过(小坑:仔细看过滤规则,是过滤|而不是\)
最终payload:
cmd=%0a`$_GET[B]`;%23&B=c\p /[@-z][@-z][@-z]g 1.txt
这里有一个小小的知识点
访问1.txt
ezRCE
对传入的cmd进行检测,最后将cmd直接使用system执行系统命令
在对cmd的检测中:
遍历cmd中的每一个字符,要求每一个字符都为white_list上面的
解决:
观察白名单上的字符只能是字符和斜杠和$符和
上一篇:linux怎么设置dns服务器?