前言:之前一直没有接触过web这方面的题,这次利用暑假时光好好学习,web真的是很有趣,虽然有的题很简单,但可以学习到很多知识,话不多说,做题。
view_source
用老版火狐浏览器,直接查看源码即可。
robots
做这道题之前,了解一下robots协议,爬虫协议,robots.txt是搜索引擎中访问网站的时候要查看的第一个文件,如果有这个文件,robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
了解robots协议后,做题就好做了,直接访问robots.txt文件。
给了一个PHP文件名,访问一下即可得出flag
backup
不知道,百度百科一下
那加上后缀名即http://111.198.29.45:47771/index.php.bak
再访问一下,即可得出flag。
cookie
用burp抓一下包看看
添加后缀名
查看HTTP响应,即可得出flag
disabled_button
根据提示,将disabled删除即可点出flag
webshell
一句话,用菜刀进行连接
连接成功,即可得出flag
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
is_numeric() 函数用于检测变量是否为数字或数字字符串。
代码很好理解,传入对应的参数即可得出flag
http://111.198.29.45:52319/?a=a
即可得出
http://111.198.29.45:52319/?b=1236b
command_execution(命令执行)
做题之前,要先了解一下ping功能,waf等。
ping命令的使用方法及功能
WAF主要防护的是来自对网站源站的动态数据攻击,可防护的攻击类型包括SQL注入、XSS攻击、CSRF攻击、恶意爬虫、扫描器、远程文件包含等攻击,相当于防火墙。
命令执行详解
常见的命令执行
command1 & command2 :先执行command2后执行command1
command1 && command2 :先执行command1后执行command2
command1 | command2 :只执行command2
command1 || command2 :command1执行失败,再执行command2(若command1执行成功,就不再执行command2)
除此之外,我们还要了解一些常用的Linux命令。常用 Linux 命令
了解之后,我们便开始做题。
首先ping一下本地即127.0.0.1
ping通本地后,发现传输三个数据包,接下来就用到我们学到的Linux基本命令
查看一下,三个数据包中是否有flag.txt
输入命令127.0.0.1 & find / -name flag.txt
果然有,再输入命令127.0.0.1 | cat /home/flag.txt
查看flag.txt文件,即可得出flag。
这里得了解一下cat命令,用来查看文件内容
weak_auth( 弱身份验证 )
试试最常用的admin 123456
组合,竟然爆出了flag,真的是弱口令,不过查了其他方法,用爆破的方法也可以做出了,这里记录一下爆破过程。
先在GitHub上下载弱口令字典,用burpsuite进行爆破
用admin作为账号,试试登陆
看来账号就是admin,那么就只爆破密码就可以了
密码随便输入一个,抓一下包
将密码设置为变量
载入字典
发现到123456
时,长度不同,所以密码即为123456
,登陆一下即可得出flag
xff——伪造IP地址来源
格式为:
X-Forwarded-For: client1, proxy1, proxy2, proxy3
referer——伪造来源浏览器
伪造XFF头绕过服务器IP过滤
了解之后,便能够做题了
抓包,根据提示修改xff
此时页面显示必须来自https://www.google.com
根据提示,伪造来源服务器,即可得出flag
simple_js
打开之后,直接查看源代码,发现一串JS代码
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) );
要做这道题就得看懂JS代码表达的意思,首先来了解代码中出现的一些方法
split() 方法用于把一个字符串分割成字符串数组。
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
prompt()方法用于显示可提示用户进行输入的对话框。
了解之后,便可以观察代码了
这一部分代码分为两个循环,但是仔细观察的话,第一个循环是将前五个Unicode 值,然后返回一个字符串,写一个简单的python脚本验证下
后一个循环功能是一样的,只不过是把后面的Unicode 值,返回成字符串。
返回的pass为
即不管我们输入什么,最终显示都是这个,所以这个是假的密码,那么真正的密码应该就是
十六进制转化为文本字符
再用简单的python跑一下,即可得出flag
题虽然不是太难,但是可以学习到很多知识,接下来得快点学习python以写脚本用,方便做题。