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