注入分类
系统函数
函数名称 | 函数作用 |
version() | mysql版本 |
user() | 数据库用户名 |
database() | 数据库名 |
@@database() | 数据库路径 |
@@version_compile_os | 操作系统版本 |
字符串连接函数
函数名 | 函数作用 |
concat(str1,str2,...) | 没有分隔符链接字符 |
concat_ws(separator,str1,str2,...) | 使用separator分隔符链接字符 |
group_concat(str1,str2,...) | 连接一个组的所有字符串,并以逗号分隔每一条数据 |
详细介绍 http://www.cnblogs.com/lcamry/p/5715634.html
漏洞盘底语句(poc)
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--
注:--+可以使用#替换,#的url编码为%23(#是注释)
常见的sql查询代码:
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
语句可能会不同,但是注意引号的闭合,当用户输入不一样的引号引起的效果是不一样的(sql语句认定引号内为字符串,且上引号对配对第一个下引号),一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用--+ 或者 #(%23)
union操作符的介绍
union操作符用于合并两个或多个select语句的结果集。请注意,union内部的select
语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 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 结果集中的列名总是等于
sql的逻辑运算
提出一个问题
Select * from users where id=1 and 1=1;
这条语句为什么能够选择出 id=1的内容,and 1=1 到底起作用了没有?
这里就要清楚 sql 语句执行顺序了。同时这个问题我们在使用万能密码的时候会用到。
Select * from admin where username=’admin’ and password=’admin’
我们可以用 ’or 1=1# 作为密码输入。原因是为什么?
这里涉及到一个逻辑运算,当使用上述所谓的万能密码后,构成的 sql 语句为:
Select * from admin where username=’admin’ and password=’’or 1=1#’
上面的这个语句执行后,我们在不知道密码的情况下就登录到了 admin 用户了。
原 因 是 在 where 子 句 后 , 我 们 可 以 看 到 三 个 条 件 语 句 username=’admin’ and
password=’’or 1=1。三个条件用 and 和 or 进行连接。在 sql 中,我们 and 的运算优先
级大于 or 的元算优先级。因此可以看到 第一个条件(用 a 表示)是真的,第二个条件(用
b 表示)是假的,a and b = false,第一个条件和第二个条件执行 and 后是假,再与第三
个条件 or 运算,因为第三个条件 1=1 是恒成立的,所以结果自然就为真了。因此上述的语
句就是恒真了。
Select * from users where id=1 and 1=1;
Select * from users where id=1 && 1=1;
Select * from users where id=1 & 1=1;
上述三者有什么区别?
1和2是一样的,表达的意思是 id=1条件和1=1条件进行运算。
3的意思是 id=1 条件与 1 进行&位操作,id=1 被当作 true,与 1 进行 & 运算 结果还是 1,
再进行=操作,1=1,还是 1(ps:&的优先级大于=)
注:此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要
的时候可以利用该方法进行注入结果。例如将某一字符转换为 ascii 码后,可以分别与
1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是 ascii 码值。再从
ascii 值反推回字符。(运用较少)
注入流程
mysql特性
表名 | 作用 |
nformation_schema | 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。 |
schema_name | schema_name 返回系统架构和用户定义架构的名称。 可以在选择列表where子句和任何允许使用表达式的地方调用schema_name。 |
information_schema.tables | 获取所有表结构 |
information_schema.columns | 获取所有表的字段 |