SQL注入方法
前言
记录一些注入思路和经常使用的工具,后续有用到新的工具和总结新的方法再继续补充。
如何测试与利用注入点
手工
下面的现象是在说存在注入点后的现象,如果服务端有防护手段就需要另外的手段绕过。
老方法:
单引号
现象:出现数据库报错。
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注入方法的更多相关文章
- sql注入方法以及防范
sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加 www.bobo.com?id=1 or 1=1 / w ...
- 另类的SQL注入方法
前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/ ...
- ref:web 防止SQL注入方法
ref:https://blog.csdn.net/beidou321/article/details/6482618 小结:spring采用JdbcTemplate来操作sql,一般不要自行拼接sq ...
- PHP最全防止sql注入方法
(1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...
- 防止SQL注入方法总结
一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...
- 使用php函数防止SQL注入方法
什么是SQL注入? SQL注入是指在你系统防御之外,某人将一段Mysql语句注入到你的数据库.注入通常发生在系统要求用户输入数据的时候,比如用户名的输入,用户可能输入的不是一个用户名,而是一段SQL语 ...
- 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement
package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...
- 网站防止SQL注入方法
方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string)) addslashes() 函数返回在预定义字符之前添加反斜杠 ...
- SQL注入方法之:获取列名
select col_name(object_id('table'),1) from sysobjects where name='table'
- 防sql注入方法
mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ...
随机推荐
- createRange表示文档中的一个范围——用于js判断文字添加省略号情况
document.createRange() 是 JavaScript 中的一个方法,用于创建一个 Range 对象,表示文档中的一个范围.Range 对象通常用于选择文档中的一部分内容,然后对其进行 ...
- windows安装nginx可视化工具nginxWebUI
一.官网下载ngixn * 官网地址<http://nginx.org/> 选取稳定版(Stable Version)二.解压压缩包三.启动Nginx1.进入安装目录下,找到nginx.e ...
- 【C#】关于ACCESS数据库insert into报错:标准表达式中数据类型不匹配
如果插入列有日期/时间类型,使用C#时,var ptime = new OleDbParameter("@DtTime", OleDbType.Date); OleDbType.D ...
- Flutter学习网站和安装问题
一.Flutter网站 Flutter中文开发者网站(推荐) https://flutter.cn/ 二.Flutter第三方库 Pub.Dev https://pub.dev/ 三.Flutter源 ...
- zabbix笔记_005 zabbix自动发现
自动发现 [消耗资源较大] 1.1 自动发现监控主机 自动发现的好处: 快速发现,并自动添加主机,省去管理员配置的麻烦. 管理简单高效 zabbix监控构建速度更高效 1.2 自动发现的原理 自动发现 ...
- c++ Primer Plus 第六版学习记录
立个flag,一天看20页,一个半月看完!!! 第一章 预备知识 高效简洁.面向对象.泛型编程 汇编不具有通用性,换一个处理器可能就要重新写一套! 编译器(是一个程序)负责解决这个问题,把一份高级语言 ...
- css 跑马灯
html: <view class="in_scro"> <view class="in_scrview">恭喜139******1用户 ...
- 什么是LAMP
LAMP Lamp是一种互联网开发架构,全称为LAMP Stack(Linux.Apache.MySQL.PHP).它是一种流行的Web开发环境,用于构建动态网站和Web应用程序.LAMP Stack ...
- 【Java面试题-基础知识02】Java抽象类和接口六连问?
1.抽象类和接口分别是什么? 抽象类是一种类,可以包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,需要在子类中被具体实现. 接口是一种完全抽象的类,其中的所有方法都是抽象方法,没有方法体,它只 ...
- linux系统下,安装maven教程
1.下载 官网:https://maven.apache.org/download.cgi 2.上传包 将下载好的maven安装包apache-maven-3.8.6-bin.tar.gz放在磁盘的 ...