View Source

image.png
image.png
这道题直接F12查看源码就可以了:
image.png

robots

image.png
image.png
根据提示需要去寻找robots.txt文件。

robots协议也叫robots.txt存放于网站根目录下,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。 robots协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。

访问根目录发现这个:
image.png
既然Disallow,那就直接去看看!
image.png

backup

image.png
image.png
这就是考察有关php的备份文件。

php的备份有两种:.php~和.php.bak。 如果网站存在备份文件,在地址栏最末加上/index.php~或/index.php.bak,即可得到备份文件(会自动下载)

image.png
image.png

Cookie

image.png
image.png
其实点击浏览器左上角的感叹号就可以查询网页的Cookie:
image.pngimage.png
这里需要某种工具来查看http响应头,chrome浏览器中可以直接查看:
image.png

disabled_button

image.png
image.png
简单来说,就是页面有一个button无法点击,查看网页源码:
image.png
从上图可知,该button被禁用了,我们可以直接修改网页源码,将disable改为enable,就可以点击了:
image.png
结果如下:
image.png

weak_auth

image.png
image.png
根据题目描述和首页,盲猜是需要我们来猜测用户名和密码,这属于网络爆破范畴。经过查阅资料,选择Burp Suit工具来进行破解。
image.png
设置本地代理,先点击login查看,捕捉网站的响应:
X}~ILZ%$F~_D64}0ZR7XS2V.png
将该会话发送到instudes,根据网页提示,将username设置为admin,密码就进行爆破,应该是简单密码,最后根据响应的长度可知密码为123456:
image.png

simple_php

image.png
image.png
从题目描述和主页的内容来看,该题考察的是php代码审计以及GET语法的使用
仔细分析代码:

  1. <?php
  2. show_source(__FILE__);//高亮显示文件内容,即当前文件绝对路径
  3. include("config.php"); // include将config.php中的代码直接赋值到当前源文件
  4. $a=@$_GET['a'];//获取get方法的a属性
  5. $b=@$_GET['b'];//获取get方法的b属性
  6. if($a==0 and $a){// PHP 强弱类型比较,查看拓展资料
  7. echo $flag1; //如果a与0相等(弱类型比较),且a为非0则输出flag1
  8. } // 可以让a=0a
  9. if(is_numeric($b)){// b不能为数字或数字字符串,否则就跳出
  10. exit();
  11. }
  12. if($b>1234){// 如果b大于1234,则输出flag2
  13. echo $flag2;
  14. }
  15. ?>

根据拓展和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

image.png
image.png
简单,用上一道题的方式即可,接着出现新的界面。
image.png
由于POST方法体中的数据是存放在HTTP报文中的,需要使用相应的工具,可以选择用POSTMAN或者HackBar,破题。
image.png

xff_referer

image.png
image.png
根据题目描述和网页可以看出,我们需要将自己的“伪造”成123.123.123.123,这就需要了解xff和referer了。
想要伪造xff可以使用burpsuite拦截用户对网站的访问并修改xff
image.png
而后更改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

image.png
image.png
我也去百度一下php一句话:
image.png
哦~原来是这样:eval会将php获取的输入当成命令去执行,相当于我们可以直接操作对方服务器!
image.png
值得注意的是,eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。通过继续查询资料发现,当网站被注入一句话木马之后,我们可以使用相关的软件直接进行远程控制,比如antsword。
image.png
而后点击测试连接就会发现脸上了,此时,我们就可以直接查看文件内容或者使用cmd命令远程操作这台肉机。
image.pngimage.png

command_execution

image.png
image.png
需要先了解什么是waf(拓展资料),通过下方的输出可以看出,主机其实就是对获取的内容直接执行,我们可以使用对命令进行拼接,从而实现“操作”对方电脑的目的
image.png
比如通过下面的命令就可以获取到flag的位置。
image.png
拓展资料——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

image.png
image.png
F12查看到一段js代码:

  1. function dechiffre(pass_enc){
  2. var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
  3. var tab = pass_enc.split(',');//按照,逗号分割成字符串数组
  4. var tab2 = pass.split(',');//按照,分割
  5. var i,j,k,l=0,m,n,o,p = "";
  6. i = 0;
  7. j = tab.length;
  8. k = j + (l) + (n=0);
  9. n = tab2.length;
  10. //获取前五个Unicode,将字符串保存到p
  11. for(i = (o=0); i < (k = j = n); i++ ){
  12. o = tab[i-l];
  13. p += String.fromCharCode((o = tab2[i]));
  14. if(i == 5)break;
  15. }
  16. //获取后面的Unicode,将字符串保存到p
  17. for(i = (o=0); i < (k = j = n); i++ ){
  18. o = tab[i-l];
  19. if(i > 5 && i < k-1)
  20. p += String.fromCharCode((o = tab2[i]));
  21. }
  22. p += String.fromCharCode(tab2[17]);//可接受一个指定的 Unicode 值,然后返回一个字符串。
  23. pass = p;return pass;
  24. }
  25. // 一串16进制的数据
  26. 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"));
  27. h = window.prompt('Enter password'); // 获取用户输入
  28. alert( dechiffre(h) ); // 调用dechiffre函数

经过测试可以发现,不管输入是什么,最终得到的pass输出都是FAUX PASSWORD HAHA。代码里有一串16进制的字符串,先将其转成十进制而后进行处理。
image.png
第一个方法是直接使用这些替换原本pass;第二个方法是使用python进行模拟:
image.png
注:chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。