1.view-source


查看源码,右键不可以用,所以按f12,直接查看源码即可(如果不行的话就用fn+f12即可)
然后就会看到答案

2.robots


知识拓展:
robots协议
robots.txt文件是一个文本文件,使用二年和一个常见的文本编辑器,比如Windows系统自带的notepad,就饿看一创建何编辑它,robots.txt是一个写以,而不是一个命令,robots.txt是搜索引擎中访问网站的时候要查看的第一个文件,robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的
所以解题时就会联想到在url后边加上robots.txt然后发现有一个disallow:flag_1_h3re.php

所以在url后边加上flag_1_h3re.php即可找到答案

3.backup



不知道,百度一下
知识拓展:
如果网站存在备份文件,常见的备份文件后缀名有:".git",".svn",".swp",".~",".bak",".bash_history",".bkf"尝试在url后面,一次输入常见的文件备份扩展名.
然后试着url改为index.php.bak提示下载文件,用txt打开得到flag

4.cookie


一说cookie就想到用burpsuite抓包

然后就添加url后缀名cookie.php

他又说让查看http响应所以就打开burp的repeater的response headers就可以看到

5.disabled_button


查看源码

发现有disabled属性,disabled属性可以设置或返回是否金庸单选按钮,所以删掉disabled属性

删掉后可以点击了,点击了一下,得到flag

6.weak_auth(弱身份验证)



随手设置的密码,应该就是弱口令,而用户名时admin

他强制说是让用admin登录
所以直接用burpsuite字典(弱口令字典)爆破

将password的值设置为变量

选择字典文件


发现到123456的时候,长度不同,所以密码为123456,登陆一下即可得出flag

7.simple_php

    目标

掌握php弱类型比较
php中其中两种比较符号:
==:先将字符串类型转化成相同,再比较
=:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用
时,字符串会先转换为数字类型再比较
var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump('123a' == 123);//true,这里'123a'会被转换为123

var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false

注:<、>、<=、>=都存在和==相同的弱类型,原理相同!!!
Writeup
PHP是世界上最好的语言!!!首先我们访问目标网址:

然后咱们分析一波

1.这里包含了config.php
2.url接收了参数a和b的值
3.如果$a等于0 and $a,输出$flag1
4.如果$b是数字或者字符串那么推出当前脚本
5.如果$b>1234,输出$flag2
所以我们这里既要保证输出$a,$b,又要保证$b是数字,那么就用到php的弱类型比较了

那么a=c&b=2222a
上述核心代码执行后就是:

if(true and true){         //这里$a==0 and $a,==为弱类型比较,字符串开头都为0,所以0==0 and 'c',因为字符串c存在,所以and后面也为true,所以双true,最后if括号里为true,执行if下面的语句
echo $flag1;
}
if(is_numeric(2222a)){
exit();
}
if(2222a>1234){
echo $flag2;

结果:

注:
include 只生成警告(E_WARNING),并且脚本会继续
is_numeric()来函数用于检测变量是否为数字或数字字符串,是返回true,否返回false
exit() 函数输出一条消息,并退出当前脚本

8.get_post


HTTP的两种请求方式
GET
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中)如:

/test/1.php?name1=value1&name2=value2

POST
POST请求是把提交的数据放置在HTTP的消息主体中 如:

POST /test/1.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

所以为了方便就用火狐然后安装hackbar插件来进行传参

9.xff_referer


看到题目先了解下xff和referer

XFF
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

简单地说,xff是告诉服务器当前请求者的最终ip的http请求头字段
通常可以直接通过修改http头中的X-Forwarded-For字段来仿造请求的最终ip

Referer
HTTP来源地址(referer,或HTTPreferer)
是HTTP表头的一个字段,用来表示从哪儿链接到当前的网页,采用的格式是URL。换句话说,借着HTTP来源地址,当前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

简单的讲,referer就是告诉服务器当前访问者是从哪个url地址跳转到自己的,跟xff一样,referer也可直接修改

题目说ip地址必须为123.123.123.123
所以抓包然后发现没有这个值传参所以直接添加
X-Forwarded-For:123.123.123.123

然后发现又有要求修改referer为https://www.google.com所以继续添加

然后就会出现我们所需要的flag

10.webshell


看题目应该是一句话木马

所以我们用蚁剑来连接

连接成功后看有什么文件,添加数据后打开

发现有flag.txt打开然后就会出现想要的答案

11.command_execution


看题目,先了解下ping、waf、命令执行、Linux命令
ping
用法:https://blog.csdn.net/qq646748739/article/details/81660514
WAF
WAF主要防护的是来自对网站源站的动态数据攻击,可防护的攻击类型包括SQL注入、XSS攻击、CSRF攻击、恶意爬虫、扫描器、远程文件包含等攻击,相当于防火墙。
命令执行
用法:https://www.freebuf.com/column/154670.html
常见命令执行

command1 & command2 :先执行command2后执行command1
command1 && command2 :先执行command1后执行command2
command1 | command2 :只执行command2
command1 || command2 :command1执行失败,再执行command2(若command1执行成功,就不再执行command2)

Linux常用命令
常用的Linux命令
用法:https://www.cnblogs.com/cokefentas/p/11101000.html
开始做题

首先先尝试ping一下127.0.0.1

    方法一:


ls命令查看目录文件
用法:https://blog.csdn.net/dyw_666666/article/details/79184126




用cat命令查看txt文件

方法二:

ping通本地后,发现传输三个数据包。查看三个数据包中是否有flag.txt
输入命令

127.0.0.1 & find / -name flag.txt


发现有flag.txt,再输入命令

127.0.0.1 | cat /home/flag.txt

查看flag.txt文件,得出flag

12.simple_js


打开题目,弹出一个弹窗,提示输入密码

随便输入一个,提示输入错误,之后查看源码,得到js源代码,是一个解码函数

源代码详解:
执行流程:
一、首先定义了一个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十六进制数转换成字符串,python下print即可,或网址:https://www.bejson.com/convert/ox2str/
输出结果55,56,54,79,115,69,114,116,107,49,50
二、执行
String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50
"));

三、调用了dechiffre,执行dechiffre函数
String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50
"));
(1)先将"55,56,54,79,115,69,114,116,107,49,50
"带入dechiffre函数执行,即dechiffre(pass_enc)=dechiffre("55,56,54,79,115,69,114,116,107,49,50
")

(2)接着我们看到了pass变量,暂时先放着

(3)因为pass_enc="55,56,54,79,115,69,114,116,107,49,50"
将pass_enc字符串分割成字符串数组,赋值给tab参数,所以:

tab=[55,56,54,79,115,69,114,116,107,49,50]   注:tab此时是字符串数组!!!

(3)随后也对pass分割

tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]

(4)变量赋值代码分析:var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
一开始i,j,k,m,n,o,没有赋值,为undefined,其它参数l=0,p="",后来i被赋值=0,j被赋值为11

(5)第九行此时n被赋值为0,所以k=11+0+0,最后等于11 注:这里的(l)其中是英文字母l,不是数字1

(6)第十行中,n=18

(7)第一个for循环,精简一下代码:

for(i = 0; i < (18); i++ )
{o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
解释:前面的o=tab[i-1]是无用的,因为后面会被o=tab2[i]的值重新覆盖
第一次循环:o=tab[0];p=p+String.fromCharCode((o = tab2[0])
=>o=70;p=""+String.fromCharCode(70)=>p=英文字母F

第二次...
第三次...
第四次...
第五次...
所以,这个for循环,最后的p为(尽管没有输出出来,这里我们知道就好)FAUX P

(8)第二个for循环,精简一下代码:

for(i = 0; i < 18; i++ ){
o = tab[i-l];
if(i > 5 && i < 17)
p += String.fromCharCode((o = tab2[i]));
}

解释:这里的for循环和上面的差不多,注意这里的p值由于第一次for循环执行后现在已经是FAUX P了
加上第一次for循环的p值,最后的p为FAUX PASSWORD HAH

(9)

p += String.fromCharCode(tab2[17]);
因为tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]

所以:p=FAUX PASSWORD HAH + A
因此,最后的p为FAUX PASSWORD HAHA

(10)pass = p;return pass;
即 pass = FAUX PASSWORD HAHA;return FAUX PASSWORD HAHA;
最后函数输出为FAUX PASSWORD HAHA

嗯哼???这个函数就执行完了???我的tab数组怎么没有用到???,我一开始带进来的参数呢?去哪了?别想了,输出值虽然用到了带进来的参数(就是分割后的tab数组),但是for循环那里人家直接使用tab2数组相关代码的值,根本没有用到tab数组的值,所以由于代码逻辑问题,你传入的dechiffre的参数pass_enc是没有任何意义的

三、dechiffre函数执行完成后,继续执行其它的代码

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

h=你输入弹框内的内容
之后alert弹出dechiffre(h)的值,由前面所有的代码可知,代码里p的值与tab无关,因为最终都会被tab2的值替代,所以我们无论输入什么,也就是pass_enc=h,无论输入的这个h等于什么,不管tab能否被分割成字符串数组,是否存在,都只会利用到tab2。通俗点讲,有关tab的参数与值都可以视为没有,因此,pass_enc参数是什么也就没有意义了

四、最后,结论就是,无论我们在弹框中输入什么值,都只会返回FAUX PASSWORD HAHA
我就猜想,会不会

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"));

这个语法错误,并且没有没计算出来的是不是最后正确的值,也就是flag~
于是,我不用它这么无论pass_enc参数输入什么都显示FAUX PASSWORD HAHA的函数,咱也抛弃它一回,自己重新写代码执行它

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
var n=String.fromCharCode(55,56,54,79,115,69,114,116,107,49,50);
document.write(n);
</script>
</body>
</html>

最后结果为:786OsErtk12
根据提示的flag格式输入最后的flag!

原文链接:https://blog.csdn.net/qq_41617034/article/details/91490695
https://blog.csdn.net/qq_43625917/article/details/96343859
https://blog.csdn.net/qq_41617034/article/details/91847131