SQL注入必知必会
最后更新时间:
文章总字数:
预计阅读时间:
1、注释方法
单行注释:可以使用#
或--
注意:使用
--
时,最后一定要有一个空格GET注入时
#
要写成%23
多行注释:使用 /* xxx */
内联注释:使用 /*! */
,/* */
在mysql中是多行注释 但是如果里面加了!
那么后面的内容会被执行
常用于Waf绕过
/*!50000*/
mysql 5通用 带版本内联注释根据MySql不同的版本,数字会不同
2、常用SQL语句
只能在SQL命令行中执行,在SQL注入中不能使用
use [database]
:使用指定的数据库
show databases
:显示所有的数据库
show tables
:显示指定数据库中所有的表
show global variables
:显示全局的配置信息
show variables like '%secure%'
:模糊查询显示相关的配置信息
3、数据库
information_schema
:元数据库,存储数据库相关信息的数据库
mysql
:存储数据库相关的信息
1 |
|
查询所有的数据库名:
1 |
|
查询'security'数据库中所有的表名:
1 |
|
查询'security'数据库下'users'表的列名:
1 |
|
查询'security'数据库下'users'表中指定列的内容:
1 |
|
4、常用函数
如果函数要在SQL命名行中执行,前面需要加select
user()
:获取当前连接到数据库的用户的用户名和主机名
1 |
|
current_user()
:当前通过哪个规则连接数据库的用户
1 |
|
@@basedir
:mysql安装的路径
1 |
|
@@datadir
:数据库的路径
1 |
|
@@version_compile_os
:获取当前操作系统版本
1 |
|
@@version_compile_machine
:操作系统的体系结构
1 |
|
database()
:当前数据库
1 |
|
version()
:数据库的版本
1 |
|
1 |
|
concat()
,concat_ws
:将多列数据合并到一列
group_concat
:将多列数据的多行值合并到一列一行
1 |
|
substr()
,mid()
:字符串截取
1 |
|
limit
:限制查询结果的数量
1 |
|
locate()
:返回字符串出现的位置
1 |
|
ascii
,ord
:获取字符的 ASCII 码值
1 |
|
char()
:返回ASCII码值对应的字符
1 |
|
length()
:返回长度
1 |
|
count()
:查询数量
1 |
|
sleep()
:休眠
1 |
|
if()
:判断
1 |
|
5、SQL注入分类
- 传参方式:GET、Post
- 参数类型:整数型、字符型
- 注入方式
- 联合查询注入:union select 联合查询
- 报错注入:页面显示报错信息,对数据库进行注入使报错,根据报错信息获取有用的信息
- 堆叠注入:一次执行多个SQL语句
- 布尔盲注:判断条件是否成立,根据页面变化来确认想要的信息
- 时间盲注(延时盲注):判断条件是否成立,根据响应时间获取信息
6、判断是否有SQL注入
核心问题是,可控参数的修改,是否可以影响sql逻辑,如果可以影响,就证明有注入点,剩下的问题无非是能否利用,如何利用的问题.
手工判断:
判断是否是注入点:找到客户端向服务器端传参,并且该参数可能会被发送到数据库执行的页面或url,(该参数称为可控参数)
修改可控参数,查看请求的返回内容是否有变化,判断和数据库是否有交互.
修改可控参数,加上单引号或者双引号或and 0或id=n-m 等字符,查看是否能报错,判断传入的参数是否能够影响原有sql执行逻辑
如果b步骤报错,则修改可控参数,尝试闭合sql语句,再使sql语句不报错,这样就可以拼接要执行的sql语句.
判断注入方式
是否可以使用union select语句页面有明确的回显内容
是否可以使用布尔盲注 通过and 0及and 1注入,返回内容只有两种变化
是否可以使用时间盲注,如果页面没有任何变化,可以尝试使用sleep函数通过延时判断是否有注入点
是否可以使用报错注入,如果页面有报错信息,则可以尝试此种方式
sqlmap自动判断