View Source
robots
根据提示需要去寻找robots.txt文件。
robots协议也叫robots.txt存放于网站根目录下,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。 robots协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。
backup
这就是考察有关php的备份文件。
php的备份有两种:.php~和.php.bak。 如果网站存在备份文件,在地址栏最末加上/index.php~或/index.php.bak,即可得到备份文件(会自动下载)
Cookie
其实点击浏览器左上角的感叹号就可以查询网页的Cookie:
这里需要某种工具来查看http响应头,chrome浏览器中可以直接查看:
disabled_button
简单来说,就是页面有一个button无法点击,查看网页源码:
从上图可知,该button被禁用了,我们可以直接修改网页源码,将disable改为enable,就可以点击了:
结果如下:
weak_auth
根据题目描述和首页,盲猜是需要我们来猜测用户名和密码,这属于网络爆破范畴。经过查阅资料,选择Burp Suit工具来进行破解。
设置本地代理,先点击login查看,捕捉网站的响应:
将该会话发送到instudes,根据网页提示,将username设置为admin,密码就进行爆破,应该是简单密码,最后根据响应的长度可知密码为123456:
simple_php
从题目描述和主页的内容来看,该题考察的是php代码审计以及GET语法的使用。
仔细分析代码:
<?php
show_source(__FILE__);//高亮显示文件内容,即当前文件绝对路径
include("config.php"); // include将config.php中的代码直接赋值到当前源文件
$a=@$_GET['a'];//获取get方法的a属性
$b=@$_GET['b'];//获取get方法的b属性
if($a==0 and $a){// PHP 强弱类型比较,查看拓展资料
echo $flag1; //如果a与0相等(弱类型比较),且a为非0则输出flag1
} // 可以让a=0a
if(is_numeric($b)){// b不能为数字或数字字符串,否则就跳出
exit();
}
if($b>1234){// 如果b大于1234,则输出flag2
echo $flag2;
}
?>
根据拓展和PHP代码可知,就是要构造a和b特定的值,打开HackBar或者直接在网址后添加GET方法:
ip/?a=0aaaa&b=1235bbbbb
而后就破题了。
拓展资料——PHP强弱类型比较
php中其中两种比较符号:
==:先将字符串类型转化成相同,再比较
===:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
var_dump(‘a’ == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump(‘a123’ == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
var_dump(‘123a’ == 123);//true,这里’123a’会被转换为123
var_dump(‘123a1’ == 123);//true
var_dump(‘1233a’ == 123);//false
get_post
简单,用上一道题的方式即可,接着出现新的界面。
由于POST方法体中的数据是存放在HTTP报文中的,需要使用相应的工具,可以选择用POSTMAN或者HackBar,破题。
xff_referer
根据题目描述和网页可以看出,我们需要将自己的“伪造”成123.123.123.123,这就需要了解xff和referer了。
想要伪造xff可以使用burpsuite拦截用户对网站的访问并修改xff。
而后更改Referer,即可破题。
拓展资料——xff与referer
XFF构造来源IP,Referer构造上一个网站的地址。
xff 是http的拓展头部,作用是使Web服务器获取访问用户的IP真实地址(可伪造)。
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。由于很多用户通过代理服务器进行访问,服务器只能获取代理服务器的IP地址,而xff的作用在于记录用户的真实IP,以及代理服务器的IP。
格式为:X-Forwarded-For: 本机IP, 代理1IP, 代理2IP……
请求头添加X-Forwarded-For: 123.123.123.123
Referer 是http的拓展头部,作用是记录当前请求页面的来源页面的地址,告诉服务器我是从哪个页面链接过来的。服务器使用referer确认访问来源,如果referer内容不符合要求,服务器可以拦截或者重定向请求。
Referer: https://www.google.com
webshell
我也去百度一下php一句话:
哦~原来是这样:eval会将php获取的输入当成命令去执行,相当于我们可以直接操作对方服务器!
值得注意的是,eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。通过继续查询资料发现,当网站被注入一句话木马之后,我们可以使用相关的软件直接进行远程控制,比如antsword。
而后点击测试连接就会发现脸上了,此时,我们就可以直接查看文件内容或者使用cmd命令远程操作这台肉机。
command_execution
需要先了解什么是waf(拓展资料),通过下方的输出可以看出,主机其实就是对获取的内容直接执行,我们可以使用对命令进行拼接,从而实现“操作”对方电脑的目的。
比如通过下面的命令就可以获取到flag的位置。
拓展资料——waf
网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF。Web应用防火墙可以防止Web应用免受各种常见攻击,比如SQL注入,跨站脚本漏洞(XSS)等。
拓展资料——命令拼接
执行命令时,可以进行命令拼接,从而实现前一个命令执行成功或失败才执行后一个命令。
command1 & command2 :不管command1执行成功与否,都会执行command2(将上一个命令的输出作为下一个命令的输入),也就是command1和command2都执行
command1 && command2 :先执行command1执行成功后才会执行command2,若command1执行失败,则不执行command2
command1 | command2 :只执行command2
command1 || command2 :command1执行失败,再执行command2(若command1执行成功,就不再执行command2)
simple_js
F12查看到一段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;
//获取前五个Unicode,将字符串保存到p
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;
}
//获取后面的Unicode,将字符串保存到p
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]);//可接受一个指定的 Unicode 值,然后返回一个字符串。
pass = p;return pass;
}
// 一串16进制的数据
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) ); // 调用dechiffre函数
经过测试可以发现,不管输入是什么,最终得到的pass输出都是FAUX PASSWORD HAHA。代码里有一串16进制的字符串,先将其转成十进制而后进行处理。
第一个方法是直接使用这些替换原本pass;第二个方法是使用python进行模拟:
注:chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。