前言
最近出差了一段时间,身心疲惫啊,博客也断更了一段时间,随便写一点,缓缓
攻防世界这个平台还是挺好的,题目种类多,writeup也很多,非常适合新手入门,今天就来写写
新手练习区的题目吧。(主要是高手区的我也不会ORZ)
攻防世界:飞机直达
view_source
生成靶场以后看一下
从题目上就看出来要看源码,发现右键呗屏蔽了,F12看一下
发现flag
get_post
按照要求get传入一个a=1
发现还要post传一个b=2,继续按照要求操作,这里使用hackbar插件进行post传值:
发现flag
robots
这道题主要考的就是机器人协议,打开靶场以后直接访问一下:ip:port/robots.txt
发现一个不允许访问的路径,我们访问看一下
发现flag
backup
这道题要我们找到网站上存在的备份文件
一般来说备份文件常见的有几种形式:压缩包、文件名.bak、文件名.backup等等,在多次尝试以后,找到index.php.bak
在文件中找到flag
cookie
打开靶场看一下:
看来是考查cookie的,F12看一下
cookie提示我们到cookie.php
下面寻找,打开cookie.php看一下:
网页上提示看返回,打开F12看到返回头里存在一个flag字段,找到flag
disabled_button
看题目预感到应该是按钮控件点不了,需要审查元素修改的,打开靶场看一下:
果真是,直接F12:
将此处的disable删除,就可以点击得到flag了
weak_auth
题目的翻译应该是脆弱认证吧,题目描述也是描述设置了一个简单的密码:
随手一试:admin----123456
得到flag,emmm,正确的做法应该暴力破解
command_execution
emm,命令执行?
打开靶场看一下:
发现一个ping功能,盲猜一手直接拼接的命令,加一个ls 试一下:
发现发挥了当前路径的文件,继续找一下:
这里就不加图了,最后在/home目录下找到flag.txt文件,cat就行了:
simple_php
打开靶场以后,发现一段php代码,分析一下:
<?php
show_source(__FILE__);
include("config.php"); //这里包含了config.php
$a=@$_GET['a'];
$b=@$_GET['b']; //url接收参数a和b的值
if($a==0 and $a){
echo $flag1; //如果$a等于0 and $a,输出$flag1
}
if(is_numeric($b)){
exit(); //如果$b是数字或者字符串那么退出当前脚本
}
if($b>1234){
echo $flag2; //如果$b>1234,输出$flag2
}
?>
分析以后,可以发现flag被分成了两段,同时满足三个条件,就可以输出完整的flag
然后这三个条件我们来分析一下:
第一个:首先要保证a=0,并且a不为null,这里可能会迷惑,后面说
第二个:保证b不是数字或字符串,是的话就退出了
第三个:保证b要大于1234
这里不熟悉php的人可能会问a怎么能同时满足=0又不为null呢?b不是整数那又怎么和1234比较呢?
这里主要是利用了php的弱类型比较,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0
所以这里我们可以这样设置a和b的值?a=JsOnGmAX&b=6666a
这样同时满足了三个条件,a为字符串,所以和0比较时,a被转化成0,然后,b不为数字和字符串,b与1234比较是,被转为成了6666,也满足了:
xff_referer
打开靶场看看;
要求我们IP地址为123.123.123.123,这里我们利用header的一个参数 X-Forwarded-For
然后发现返回变了,要求我们来源必须是谷歌,那我们再加一个header:Referer
找到flag
webshell
看一下靶场:
一句话木马,拿工具连一下,这里用的是蚁剑:
连接成功,发现目录下发现flag.txt文件
打开发现flag:
simple_js
打开靶场以后发现要求输入密码:
但是试了几个都是错误的:
右键查看一下源码,发现一段代码;
代码如下:
`
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
</script>
</head>
</html>
````
分析一下,发现不论输入什么都会跳到假密码,而真密码是在fromCharCode
所以这里将这段Unicode编码转换为字符串得到:
55,56,54,79,115,69,114,116,107,49,50
然后,将ASCII码转到字符串,得到flag:
786OsErtk12
用到的脚本:
s = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
l = s.split(",")
for i in l:
print(chr(int(i)), end="")
## 写在最后
花了点时间把web区新手练习题写了一下,作为新手入门难度层层递进,还是很不错,接下来会继续更新一些其他的题,以及高手进阶区的题