基础知识
常见的系统函数
- version() 查看数据库版本
- user() 数据库用户
- database() 数据库名
- @@datadir 数据库路径
- @@version_compile_os 操作系统版本
字符串链接函数
-
concat(str1, str2,....) 没有分割的链接字符串
-
concat_ws(separator, str1, str2, ...) 含有分割符链接字符串
-
group_concat(str1, str2,...) 链接一个组所有字符串, 并以逗号分隔每一条数据
这三个函数可以一次性的查出所有信息(limit 0,1 是一个一个 的查询)
常见的闭合字符
--+ 可以使用#, 来代替或者亦可以使用%23来代替
or 1=1 --+
‘or 1=1 --+
“or 1=1 --+
)or 1=1 --+
')or 1=1 --+
”)
“))
一般代码为:
$id=#_GET['id'];
$sql="SELECT * REOM users WHERE id='$id' LIMIT 0,1";
这个主要两个方向解决一、闭合前面的’ 二、闭合后面的引号或者注释掉,注释符(#, %23, --+)
union的使用
union操作符用于合并两个或者多个select语句结果集。union内部的语句必须拥有相同数量的列,同时列也必须要有相似的数据类型。每条select语句中的列的顺序必须相同。
sql union 语法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
默认的,union操作符选取不同的值,如果允许重复的值,使用UNION ALL
SQL UNION ALL语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
union 结果集中的列名总是等于union中第一个select语句中的列名
sql逻辑运算
select * from users where id=1 and 1=1;
select * from admin where username='admin' and password='admin' # 这里可以 使用‘or 1=1#来登录
在sql中and的运算优先级大于or
select * from adin where username='admin' and password=' ' or 1=1
在执行第一个and运算后得到false, false or 1=1 得到true ,因为1=1恒成立。所以语句最终为true
1 select * from users where id=1 and 1=1;
2 select * from users where id=1 && and 1=1;
3 select * from users where id=1 & 1=1;
上述3个查询语句 其中1,2 都是表达id=1 和1=1条件进行与运算。
3的意思是id=1 条件与1 进行& 位操作,id=1 作为true,与1进行&运算结果还是1,再进行=操作,1=1,还是1(其中&的优先级大于=)
此处进行的位运算,可以将数转换为二进制再进行与,或,非,异或等运算。可以利用改方法进行注入。列如将字符转换为ascii后,可以分别与1,2,4,8,16,32...进行与运算,可以得到每一位的值,凭借起来就是ascii的值,再反推会字符
注入流程
graph LR
A[数据库] -->B(数据表)
B -->E(字段名)
E -->F(数据)
A -->C(数据表)
C -->column2(字段名)
column2 -->data(数据)
A -->D(...)
数据库存储数据如同上图,每个库中存着许多表,每个表中有着许多字段,每个字段中存着对应的数据
mysql的基本操作:
mysql 登录:
mysql -u username -p password -h IP -P port
mysql -u 用户名 -p直接加密码 或者mysql -u 用户名 -p
密码换行输入
-h 数据库IP地址,默认127, localhost
-P 端口号
查看数据库:show databases;
使用数据库:use 数据库名;
查看数据表: show tables;
查看表的结构: desc 表名;
查询语句: select table_name from information_schema.tables where table_schema = "security";
mysql 有一个系统数据库information_schema,存储着所有的数据库相关信息,一般的,可以利用该表进行一次完整的注入。一般流程如下:
猜数据库:
select schema_name from information_schema.schemata
猜某库的数据表:
select table_name from information_schema.tables where table_schema='xxxxx'; 这里的xxx同样可以使用十六进制编码来代替
猜数据表的字段:
select column_name from information_schema.columns where table_name='xxx'; # 这里的‘xxx’同样可以使用十六进制来代替。
获取字段的内容:
select xxx from xxx
参考文章
sql注入天书,以及各位大佬blog
网友评论