一、buuctf_php_Easy Calc 1
首先抓包:
打开cal.php如下,里面有一些过滤,但是这些过滤很简单,按道理可以直接出flag的。。
但是事情却没那么简单,经过测试,完全执行不了,发现内含了一个waf。
可以看到下面,在num前面加了一个空格才绕过了,原因在于这样waf检测不到num变量。
这里提醒一下,直接在地址栏输入+号会被url变成空格,因此+需要实体编码%2b
接下来就是无脑爆破了
num=var_dump(scandir(chr(47))):
num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
php绕过waf资料:
PHP的字符串解析特性
我们知道PHP将查询字符串(在URL或正文中)转换为内部关联数组$_GET或关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
/news.php?%20news[id%00=42"+AND+1=0–
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除前后的空白符(空格符,制表符,换行符等统称为空白符)
2.将某些字符转换为下划线(包括空格)
例如:
User input Decoded PHP variable name
%20foo_bar%00 foo_bar foo_bar
foo%20bar%00 foo bar foo_bar
foo%5bbar foo[bar foo_bar
因此假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num=aaaa //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num=aaaa //显示非法输入的话
这样waf就找不到num这个变量了,因为现在的变量叫" num",而不是"num"。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
二、【BUUCTF】[ACTF2020 新生赛]BackupFile1
常见的备份文件后缀名有 .git .svn .swp .~ .bak .bash_history
打开后的代码如下。
==在两边类型不一样的时候会先转换成同一类型的,int==str时,会将str转换成int,而且转换的逻辑就是匹配前面的合法数字。因此只能匹配到123.如下实验:
因此只需要:
三、BUUCTF WEB [极客大挑战 2019]BuyFlag
只有cuit能买?我一开始想的是X-forwarded-for构造cuit的ip。其实这题考的是身份认证罢了。
身份认证就是cookie、session这一套了吧。抓个包看到了cookie:
注意这个cookie是需要从主页跳转到pay.php 这样抓包才能看得到。因此有时候也要从主页一步一步地抓包,才有可能有东西。
最终构造如下:cookie user处设一个1,传入post数据。
主要是绕过下面的:
第一个是password,这个好理解,由于是弱等于,因此直接404aa转换就行了。
下面比较难的是money的长度有限制。
有两种方法:
1、传入1e9,这个长度小于4并且能识别成。
不管传啥,都是string,因此都是需要进行一些转化的。
所以1e9肯定能转化成正常数字的。
2、传入数组。
首先是绕过长度的控制,由于strlen函数是需要传入str字符串的,传入数组会返回0,因此0<4
其次就是绕过大小了。其内部实现应该是strcmp,这个函数传入了数组时,也会返回0。一般情况下返回0是相等,因此满足要求。
三、[护网杯 2018]easy_tornado
burp抓包显示304:
304状态是在有缓存下
浏览器会发一下当前页面的etag,如果服务器那边显示该etag对应的网页并没有变化,
那么不会返回之前的相同页面(毕竟客户端缓存中已经有了)。
第一次发的包:
第二次发的包:
多了这个If-None-Match,因此要想不收到这种包,直接把If-None-Match去掉即可。
收到的response:
这题存在sstl注入,也就是模版注入
题目提示了render,也就是render模版注入。render经常被用于返回一个具体的模版,如果参数可控的话,就能生成指定的内容。简单点就是把数据插入到html中去。
例如:
获取到了'cookie_secret': '3f0903de-3ce5-4a52-a28b-2bd2df8d3cb9'
接下来看提示:
后面的就简单了:
这里写一点关于前后端渲染的区别,render应该属于后端渲染。
四、[HCTF 2018]admin
首先查看源代码,以后分析要仔细,先各个代码都查看一下。
打开之后发现是网页代码,开始代码审计。
看不出啥情况。它会检测session,如果session对应的name是admin则会暴出flag。
由于flask的session是存在于客户端的。因此可以伪造session。可以看到下图抓包有session。
网上有代码可以直接解密反序列化:
得到:
这里直接用工具把结果的name修改成admin,然后加密成session即可:
发包获得flag:
还有一种利用内部str_lower函数的漏洞,这个是from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep,说明nodeprep是从twisted模块中导入的。
因此发包如图:
登陆成功:
由于在修改密码的地方再次使用了strlower函数如下:
因此用该账号改密码,其实会修改admin账号的密码。
最终结果如图:
还有一种条件竞争,好像没复现成功,也不追求了。
五、[BJDCTF2020]Easy MD5
先是简单的md5比较绕过如下,也就是md5(数组)会返回null
随后如下所示,不同的是一个==一个是===,因此前面的可以用0e的那个绕过。
六、[ZJCTF 2019]NiZhuanSiWei
hackbar在这种情况下:
源代码:
这题并不复杂,直接上解答:
七、[ZJCTF 2019]NiZhuanSiWei
典型的文件上传题:
上传了半天,结果都不行,改了content-type之类的:
估计是有黑名单之类的:
用.htacess来绕过: