本文章只是梳理逻辑和学习sql注入时遇到的问题记录,如有错误,欢迎指正~
什么是SQL注入?
SQL注入攻击是利用网站程序漏洞,通过提交恶意构造的SQL语句,以达到窃 取、修改、破坏数据库为目的的攻击。
Get注入和Post注入区别:
Get注入可以直接在url修改参数
Post注入要在输入框(请求正文)中修改参数
盲注
盲注就是页面没有回显,啥也看不到的时候进行的注入。
布尔盲注:我们虽然看不到报错,但是可以通过我们输入的信息返回的正确或错误的页面来判断条件的真假,通常使用“ or ”来连接我们注入的语句。
时间盲注:通常使用sleep()函数,通过浏览器返回的时间的长短来判断语句是否为真。例:
Id=1’ or if((),sleep(2),0) %23
if条件中第一个参数为真,sleep(2),为假立即返回0
注入思路:
- 判断是否有注入(页面是否会因为我们的输入而改变)
- 能否让页面报错:分别加入“ ‘ ”、“ “ ”和“(”进行测试
- 如何让页面不报错:让sql语句成功闭合
- 是否能够被恶意修改,eg:使用group by验证该数据库的表有几列
- 能否成功执行
- 获取数据(数据库-->表-->字段-->值)
常用的函数和语句:
- group by 查询列数
group by是一个分组排序的函数,group by后面跟的数字是几就会按第几列进行排序,所以我们可以使用group by来判断出这个数据库有多少个字段。若有9个字段,group by 1~9都不会报错,但是输入group by 10甚至更大的数时就会报错,因为这个表中没有第10列,因此我们可以得出结论,此时的表有9列
2. union 查询内容
我们一般在测试的?id=1 union select ……,但是一般只会显示左边(id=1)查询的内容,此时我们组要让左边为假,才能显示出union select……查询的内容,可以使左边为?id=-1或者?id=1 and 0,就可以显示出右边查询的内容了。
3. # 、%23 、--+注释
通常跟在语句的后面注释掉输入框后的内容
4. substr (,,)和mid(,,) 截取字符串
第一个参数是要截取的值(字符串),第二个参数是截取的起始位置,第三个参数是截取多少个字符(偏移量)
ps:Limit(0,1):从第0行开始截取到第一行
5.数据库的相关信息
数据库版本:@@version()
数据库路径:@@basedir()
数据库名:database()
6. user() 当前用户名
7. 连接字符串 concat() 、group_concat()
concat()就是普通的 、group_concat()
常用的参数:
0x7e = ~
%23 = #
绕过
空格绕过(%a0、/**/、加“()”将关键字分隔【select(1)from(admin)……】、)、大小写绕过、Uniunionon selselectect 、/*!union*/ /*!select*/
宽字节绕过
GBK(8140-FEFE)、GB2312(汉字:B0A1-F7FE)
加’报错,被\吃掉了,我们可以用GBK编码,将\吃掉,\=5c,GBK是从8140开始的,5c比40大,可以在其前面加%81,
让%81+\变成一个汉字,就可以绕过了
Id=-1%81’ union select 1,2,3 %23
Id=-1%81’ union select 1,version(),3 %23