攻防世界-Web(进阶区)

  1. 前言
  2. Web1:Cat
  3. Web2:ics-06
  4. Web3:NewsCenter
  5. Web4:mfw
  6. Web5:NaNNaNNaNNaN-Batman
  7. Web6:upload
  8. Web7:PHP2
  9. Web8:unserialize3
  10. Web9:ics-05
  11. Web10:bug
  12. Web11:Triangle
  13. Web12:web2
  14. 写在后面

前言

又做了几道攻防世界的Web题,总结一下。

Web1:Cat

题目没提示。点开题目,以为是命令执行。然而几番尝试后,发现并不是。。。
在这里插入图片描述
其它也没什么提示,没思路了。偷瞄大佬博客
在这里插入图片描述
在这里插入图片描述
然后我开始复现,?url=%80产生报错,找到绝对路径。
在这里插入图片描述
从配置文件settings.py的报错中查看database的相关信息?url=@/opt/api/api/settings.py

在这里插入图片描述
?url=@/opt/api/database.sqlite3,报错信息中搜索ctf
在这里插入图片描述

Web2:ics-06

在这里插入图片描述
题目提示:设备管理基础服务数据处,有入侵者的痕迹。这个地方应该就是题了。
在这里插入图片描述
看到?id=1第一个想法便是SQL注入,结果失败了。偷瞄大佬博客,发现需要爆破。于是我爆破id值
在这里插入图片描述
所以id=2333时,返回长度不同,即可能返回了flag,查看得到flag
在这里插入图片描述

Web3:NewsCenter

emmm。题目报错。。等题目正常了再更新总结。

Web4:mfw

题目没提示,直接开始做题。先查看源码
在这里插入图片描述
有个flag页面,直接尝试,发现返回空白页面。然后再次发现有效信息,发现下面这个
在这里插入图片描述
Git?!难道存在git源码泄露。果然是
在这里插入图片描述
使用GitHack.py工具下载源码,并打开
在这里插入图片描述
在这里插入图片描述
assert()函数 检查一个断言是否为 FALSE。

bool assert ( mixed $assertion [, string $description ] )

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
PHP 之 assert()函数
strpos() 函数 查找字符串在另一字符串中第一次出现的位置。
file_exists() 函数 检查文件或目录是否存在。
审计源码:
1、git传入page并赋值给$page$file等于templates目录下的(page值).php文件内容
2、如果strpos('$file', '..') === false$flie会被 assert() 当做 PHP 代码来执行。
3、用file_exists() 函数检查$file文件是否存在。如果存在,返回文件内容。
然后就是拼接构造payload了(又偷瞄了大佬博客)

about.php', '123') === false and system('cat templates/flag.php') and strpos('templates/flag

最终,得到flag
在这里插入图片描述

Web5:NaNNaNNaNNaN-Batman

题目,没有提示,只有个文件,下载查看
在这里插入图片描述
应该是js代码(涉及了我的盲区,所以偷瞄大佬博客)。
在这里插入图片描述

eval() 函数:可计算某个字符串,并执行其中的的 JavaScript 代码。
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 

js代码一般可以在浏览器控制台执行。加上<script></script>标签也可以在html执行。控制台执行和html执行都是一个输入框。
在这里插入图片描述
emmm。。。又不知道了(再次偷瞄)。
方法一:审计代码,满足关键变量e的正则条件

e.length==16
e.match(/^be0f23/)!=null
e.match(/233ac/)!=null
e.match(/e98aa$/)!=null
e.match(/c7be9/)!=null

^表示开头一定要匹配到be0f23,$表示结尾一定要匹配到e98aa,其它的只要匹配到就行,没有位置要求

于是我们构造e的值:be0f233ac7be98aa

将构造的e输入到最初html执行的输入框中得到flag
方法二:直接将下面代码复制到控制台执行

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)
}

在这里插入图片描述

Web6:upload

emmm。题目报错。。等题目正常了再更新总结。

Web7:PHP2

题目没有提示
在这里插入图片描述
百度翻译一下,“你能浏览这个网站吗?”
不能。。御剑扫描无果,源码也无发现。url后加index.php也不对。。。
看大佬wp,竟然是url后加index.phps。。。
在这里插入图片描述
urldecode()函数 解码 URL 字符串函数。
此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号(’+’)被解码成一个空格字符)。
该函数经常被使用于php解码URL中的中文字符串。
相关函数:urlencode()函数,编码URL字符串函数。

审计代码,get传入的id经过urldecode()函数解码,如果解码结果为admin,输出“Access granted!”和Key值(即flag)。
尝试对d进行url编码,即传入?id=a%64min,失败了。。。
于是再次分析代码,发现是经过两次urlencode()函数解码。难道再对%编码?!%编码结果%25,
传入?id=a%2564min,得到flag
在这里插入图片描述

Web8:unserialize3

题目提示unserialize,即反序列化。总结过,所以直接做题
在这里插入图片描述
于是用serialize函数进行序列化(试过一句话,没有成功)

<?php
class xctf{
    var $flag = '111';
}
$class1 = new xctf;
$class1_ser = serialize($class1);
print_r($class1_ser);
?>

在这里插入图片描述
测试,发现显示”bad requests“。
查询百度发现,当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
payload

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

得到flag
在这里插入图片描述

Web9:ics-05

在这里插入图片描述
题目提示:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
所以工控云管理系统设备维护中心存在后门。查看源码
在这里插入图片描述
几经尝试,发现,存在文件包含漏洞,可以使用php://filter伪协议对index.php进行读取
在这里插入图片描述
Base64解码,找到关键代码如下:

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

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

代码审计一下:
get传入pat、rep、sub并分别赋值给变量$pattern$replacement$subject。如果设置了$pattern$replacement$subject,执行preg_replace($pattern, $replacement, $subject);进行正则表达式的搜索和替换。

preg_replace( pattern , replacement , subject ) 函数
当pattern指明/e标志时 ,preg_replace()会将replacement部分的代码当作PHP代码执行 (简单的说就是将replacement参数值放入eval()结构中)
参考博客:深入研究PHP中的preg_replace和代码执行
构造payload寻找flag:

?pat=/test/e&rep=system('find / -iname flag')&sub=test

源码提示127.0.0.1,所以X-Forwarded-For进行欺骗,Forward发包
在这里插入图片描述
ls查看flag目录内容
在这里插入图片描述
再通过cat命令,查看flag.php内容。查看源码,得到flag
在这里插入图片描述

Web10:bug

题目没有提示。
打开题目,注册用户。进入到设置密码页面,修改密码,抓包
在这里插入图片描述
尝试更改用户名为admin。发包,提示IP禁止。
所以XFF(X-Forwarded-For)欺骗:X-Forwarded-For: 127.0.0.1
在这里插入图片描述
登录成功。Where Is The Flag?查看源码
在这里插入图片描述
filemanage,文件管理?!我学过文件上传漏洞和文件包含漏洞。应该就是其中一种,尝试之后发现do=upload时,是文件上传页面。应该就是文件上传漏洞了
在这里插入图片描述
上传测试发现,只能上传图片
1、写一个php文件,后缀改为.jpg,抓包改为.php进行文件类型绕过,结果失败。
2、.php改为.php3.php5也是失败。
3、又想到做i春秋Web题Upload时,用到

<script language="pHp">@eval($_POST['a'])</script>

于是尝试再尝试,发现后缀还要是.php3.php5才能绕过
在这里插入图片描述
发包得到flag

Web11:Triangle

还没搞懂,过段时间补上总结

Web12:web2

在这里插入图片描述
题目提示:解密
在这里插入图片描述
相关函数
strrev():反转字符串。
str_rot13():对字符串执行 ROT13 编码。
base64_encode():对数据进行base64编码
base64_decode():对数据进行base64解码
审计php代码,写出PHP解密代码

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function decode($miwen){
    $_o=base64_decode(strrev(str_rot13($miwen)));//echo $_o;
    for($_0=0;$_0<strlen($_o);$_0++){
        $_c=substr($_o,$_0,1);
        $__=ord($_c)-1;
        $_c=chr($__);
        $_=$_.$_c;
    }
    return strrev($_);
}
echo decode($miwen);
?>

在这里插入图片描述
还可以写成python脚本进行解密。我不太会写,引用大佬脚本:

import base64
def python_decode(string):
    zimu = "abcdefghijklmnopqrstuvwxyz" 
    rot_13 ="" 
    for i in string: 
        if i.isdigit():
            rot_13 += i
        else:
            try:
                rot_13 += zimu[zimu.index(i)-13] 
            except:
                rot_13 += zimu[zimu.index(i.lower())-13].upper()
    fz = rot_13[::-1]
    base = base64.b64decode(fz)
    base = [chr(ord(i)-1) for i in base]
    fz = base[::-1]
    print "".join(fz)

python_decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws")

在这里插入图片描述

写在后面

就先总结那么多吧,后边的题貌似很难。继续努力吧。。。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏