攻防世界-Web(进阶区)

前言

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

Web1:Cat

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

攻防世界-Web(进阶区)_第4张图片
?url=@/opt/api/database.sqlite3,报错信息中搜索ctf
攻防世界-Web(进阶区)_第5张图片

Web2:ics-06

攻防世界-Web(进阶区)_第6张图片
题目提示:设备管理基础服务数据处,有入侵者的痕迹。这个地方应该就是题了。
攻防世界-Web(进阶区)_第7张图片
看到?id=1第一个想法便是SQL注入,结果失败了。偷瞄大佬博客,发现需要爆破。于是我爆破id值
攻防世界-Web(进阶区)_第8张图片
所以id=2333时,返回长度不同,即可能返回了flag,查看得到flag
攻防世界-Web(进阶区)_第9张图片

Web3:NewsCenter

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

Web4:mfw

题目没提示,直接开始做题。先查看源码
攻防世界-Web(进阶区)_第10张图片
有个flag页面,直接尝试,发现返回空白页面。然后再次发现有效信息,发现下面这个
攻防世界-Web(进阶区)_第11张图片
Git?!难道存在git源码泄露。果然是
攻防世界-Web(进阶区)_第12张图片
使用GitHack.py工具下载源码,并打开
攻防世界-Web(进阶区)_第13张图片
攻防世界-Web(进阶区)_第14张图片
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
攻防世界-Web(进阶区)_第15张图片

Web5:NaNNaNNaNNaN-Batman

题目,没有提示,只有个文件,下载查看
攻防世界-Web(进阶区)_第16张图片
应该是js代码(涉及了我的盲区,所以偷瞄大佬博客)。
攻防世界-Web(进阶区)_第17张图片

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

js代码一般可以在浏览器控制台执行。加上标签也可以在html执行。控制台执行和html执行都是一个输入框。
攻防世界-Web(进阶区)_第18张图片
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)
}

攻防世界-Web(进阶区)_第19张图片

Web6:upload

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

Web7:PHP2

题目没有提示
攻防世界-Web(进阶区)_第20张图片
百度翻译一下,“你能浏览这个网站吗?”
不能。。御剑扫描无果,源码也无发现。url后加index.php也不对。。。
看大佬wp,竟然是url后加index.phps。。。
攻防世界-Web(进阶区)_第21张图片
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
攻防世界-Web(进阶区)_第22张图片

Web8:unserialize3

题目提示unserialize,即反序列化。总结过,所以直接做题
攻防世界-Web(进阶区)_第23张图片
于是用serialize函数进行序列化(试过一句话,没有成功)


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

攻防世界-Web(进阶区)_第24张图片
测试,发现显示”bad requests“。
查询百度发现,当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
payload

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

得到flag
攻防世界-Web(进阶区)_第25张图片

Web9:ics-05

攻防世界-Web(进阶区)_第26张图片
题目提示:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
所以工控云管理系统设备维护中心存在后门。查看源码
攻防世界-Web(进阶区)_第27张图片
几经尝试,发现,存在文件包含漏洞,可以使用php://filter伪协议对index.php进行读取
攻防世界-Web(进阶区)_第28张图片
Base64解码,找到关键代码如下:

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

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

    echo "
Welcome My Admin !
"
; $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发包
攻防世界-Web(进阶区)_第29张图片
ls查看flag目录内容
攻防世界-Web(进阶区)_第30张图片
再通过cat命令,查看flag.php内容。查看源码,得到flag
攻防世界-Web(进阶区)_第31张图片

Web10:bug

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

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

于是尝试再尝试,发现后缀还要是.php3.php5才能绕过
攻防世界-Web(进阶区)_第36张图片
发包得到flag

Web11:Triangle

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

Web12:web2

攻防世界-Web(进阶区)_第37张图片
题目提示:解密
攻防世界-Web(进阶区)_第38张图片
相关函数
strrev():反转字符串。
str_rot13():对字符串执行 ROT13 编码。
base64_encode():对数据进行base64编码
base64_decode():对数据进行base64解码
审计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);
?>

攻防世界-Web(进阶区)_第39张图片
还可以写成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")

攻防世界-Web(进阶区)_第40张图片

写在后面

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

你可能感兴趣的:(CTF,CTF)