常见sql注入的类型

这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解

目录

  • 最基础的注入-union注入攻击
  • Boolean注入攻击-布尔盲注
  • 报错注入攻击
  • 时间注入攻击-时间盲注
  • 堆叠查询注入攻击
  • 二次注入攻击
  • 宽字节注入攻击
  • base64注入攻击
  • cookie注入攻击-http请求头参数注入
  • XFF注入攻击-http请求头参数注入
  • 知道绝对路径的注入

0x01最基础的注入-union注入攻击

  1. 判断是get型还是post型注入;
  2. 找到正确的闭合规则;
  3. order by 查询字段数;
  4. union select 1,2.....查看显示位是第几位,没有的话就试试把id=1的显示位让出来,让其等于id=-1;
  5. 第二、三位显示出来了,那么即可在这两个位置写入sql语句;
  6. 查询当前数据库,当前mysql用户 union select 1,user(),database();
  7. 查询当前数据库里面的表 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="data_name";
  8. 查询到敏感表名user,继续查询表里面的字段 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="user";
  9. 查询字段,例如“id”、"passwd"的内容 union select 1,id,passwd from user;
  10. 拿到用户、密码登入后台。

0x02 Boolean注入攻击-布尔盲注

  • 查看现象,能报错,但没有报错信息,正确查询也显示不了查询内容就属于布尔盲注,只存在两种状态,对或错;
  • 由页面的两种不同返回的状态来判定我们的闭合规则;
  • 为了方便,我们这里假设返回正确用“yes”,返回错误用“no”来表示这两种状态
  • 找到闭合规则后,我们在闭合规则里面  and 1=1 和 and 1=2 测试一下,看看最后返回是不是两种状态;
  • 布尔盲注要用到length()和substr()语句,用两种状态来猜解数据库、表名等的长度和正确字母;
  • 先用 and length(database())>2 来猜数据库的长度,使用的是二分法;
  • 再用 and substr(database(),1,1)=‘t‘ 来确定第一个字母,可用burp跑,26个字母,哪个字母返回yes则代表第一个字母就是它;
  • and substr(database(),2,1)=‘t‘ 代表当前数据库的第二个字母;
  • 最后结合长度,成功的将数据库猜解出来;
  • 后面的操作跟union注入的步骤差不多了,只是sql语句写在 上文的 database() 处。

0x03 报错注入攻击

  1. 只要注入点有sql报错信息,那么就可以使用报错注入;
  2. 还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的sql语句;
  3. updatexml报错获取当前数据库:

    and updatexml(1,concat(0x7e,(select database()),0x7e),1)
  4. floor报错获取当前数据库:

    and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
  5. 两种方式都可行,如果第一个不行就试试第二个
  6. 接着可以利用select语句替换掉上面database()来继续获取数据库中的表名、字段名,查询语句和union注入攻击的语句相同;
  7. 只不过这里不能再使用group_concat了,因为报错注入只显示一条结果,所以需要使用limit语句;

0x04 时间注入攻击-时间盲注

  • 没有明确的现象,不管是对是错都返回一个状态;
  • 但是如果用sleep(5)方法,能让响应时间延迟为5秒以上,那么就为时间盲注;
  • 我们用sleep(5)函数构造了一个时间延时的状态,因此,我们又有了两种状态,像布尔盲注一样可以根据这两种状态来判定数据库、表名和字段名的长度和正确的每个字母;
  • 同样的找到正确的闭合规则,当然,这个闭合规则得配合着 and sleep(5)语句来构造,哪一个闭合规则执行了sleep(5),那么就是正确得闭合规则;
  • 时间盲注配合着  if(A,B,C)  语句结合使用,含义是:如果A是 true,则返回B(也就是执行B),否则返回C(执行C);
  • 那么判断当前数据库名的长度的语句为:

    if (length(database())>1,sleep(5),1)

    就是说如果数据库长度大于1,那么响应延时5秒,否则执行select 1(也就是不延时),由此来推出数据库长度。

  • 判断当前数据库名的第一个和第二个字母的语句:

    if(substr(database(),1,1)=‘s‘,sleep(5),1)
    if(substr(database(),2,1)=‘s‘,sleep(5),1)

    只有第一个字母等于26个字母中正确的字母时,才会延时5秒,因此可以通过burp或者sqlmap来跑。

  • 根据数据库名长度以此内推即可得出完整的数据库的库命、表名、字段名和具体内容。

0x05 堆叠查询注入攻击

  1. 可以使用堆叠注入的地方也可以使用布尔盲注与时间盲注;
  2. 同样先找出正确的闭合规则,然后也看两种状态来猜解库名、表名等;
  3. 堆叠注入的语句为

    ;select if(length(database())>1,sleep(3),1)
    ;select if(substr(database(),1,1)=‘r‘,sleep(3),1)
  4. 按照原理来说,分号后面可以执行新sql语句,但是很多时候没必要,如果遇到其他注入方法(或者绕过方式)不行的情况下可以试试这个注入方式;不是很常用。

0x06 二次注入攻击

  • 二次注入一共有两个url,url一用来注入,也就是注入点,插入sql语句的地方,另外一个url用来返回信息;
  • 也就是url一插入了sql语句,url一的响应里面就会返回这条信息对应的id值,然后url二就传入这个新id值,然后访问,响应回来之后将会爆出sql语句查询的结果,正确或者错误的sql信息;
  • 就相当于url是一个用户注册的地方,用户注册后会在数据库里面加入新id存放用户的注册信息,那么这个id可以传给url二来访问,url二就可以显示出用户的注册信息,但如果注册信息含义恶意sql语句,url二就会显示出敏感的数据库信息;
  • 跟union注入攻击差不多,只是回显的信息需要在另外的url中显示出来了;
  • 后面就是union注入攻击的常规操作。

0x07 宽字节注入攻击

  1. 如果遇到单、双引号被转义,变成了反斜杠,导致参数id无法逃逸单引号的包围;
  2. 一般情况下,此处就不存在sql注入漏洞的;
  3. 但是如果数据库的编码为GBK时,就可以使用宽字节注入,因此在不知道是否是GBK编码时,都可以尝试去使用宽字节注入;
  4. 宽字节的格式是在地址后先加一个  %df  ,再加单引号,因为反斜杠的编码为%5c,在GBK编码中,%df%5c是繁体字“連”,因此,单引号成功逃逸,爆出sql错误;
  5. 因此构造闭合规则时,在单引号前面加上  %df 就行了;
  6. 之后在闭合规则中写入同union注入的一些查询语句就行了;

0x08 base64注入攻击

  • 如果遇到url的参数id的值看起来像base64的,先拿去url解码,然后如果是base64,拿去base64解码,解出来的应该就是id的值(1,2等数字);
  • 那么如果要对这个url进行sql注入测试,就需要对id后面的所有值进行base64编码;
  • 注入的方式步骤都是跟union注入一样的,只不过后面的所有值(整个payload)都要进行base64编码后传给url的c参数提交,包括闭合规则。

0x09 HTTP请求头参数注入-cookie注入攻击

  1. 抓包对一个url的http请求头的所有参数进行sql注入测试,里面的所有参数都有可能存在注入点,如果响应包出现sql报错,那么测试的这个参数就是注入点;
  2. 常见的http头部注入的参数有:

    【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】
  3. 如果测试到cookie参数的时候,响应有报sql错误,那么就是cookie注入攻击;
  4. 和union注入的差别就在于注入点不一样,之后使用union注入的方法即可。

0x10 HTTP请求头参数注入-XFF注入攻击

  • XFF注入即HTTP头部的X-Forwarded-for参数存在sql注入;
  • 例如测试此参数的值  X-Forwarded-for:127.0.0.1‘  响应有sql报错,那么此处就是注入点;
  • 之后使用union注入的方法完成即可。

0x11 知道绝对路径的注入

  1. 如果通过一些方式爆出了网站的根目录,并且知道此站点存在sql注入;
  2. 猜测此数据库可能有file权限,那么我们就可以使用语句:into outfile 来写shell到网站的根目录下,之后用菜刀连接;
  3. 如果数据库没有file权限,那么我们用sqlmap的参数 --is-dba  来查看当前数据库的用户是否有管理员权限;
  4. 如果有管理员权限,我们就可以使用sqlmap里面的参数命令  --os-shell  来上传、反弹shell,最终getshell;
  5. 如果file、管理员权限都没有,那么另寻思路,日志、缓存写入等。

简单的介绍了大致遇到的sql注入存在的类型,但是实际情况下可能会遇到更奇葩的sql注入利用方法,但是掌握了这些基本的sql注入之后,对后面sql注入的进阶会更有帮助;之后还会介绍sql注入常用到的绕过技术。

原文地址:https://www.cnblogs.com/-chenxs/p/11614129.html

时间: 2024-10-10 21:29:35

常见sql注入的类型的相关文章

XSS过滤JAVA过滤器filter 防止常见SQL注入

Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的. sql注入所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执

常见sql注入原理详解!

1.首先我们创建一个mysqli的链接 /**数据库配置*/ $config = ['hostname'=>"localhost", 'port'=>"3306", 'username'=>"root",'password'=>'','db'=>'sql']; /**接收参数*/ $id = $_GET['id']?$_GET['id']:""; if(empty($id)){ echo &quo

转:PHP中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

MySQL防范SQL注入风险

0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本低.收益大,颇受各层次的黑客们所青睐. 一般来说,SQL注入的手法是利用各种机会将恶意SQL代码添加到程序参数中,并最终被服务器端执行,造成不良后果. 例如,我们访问接口 http://imysql.com/user.php?userid=123 来根据userid获取用户信息,假设程序中是这么处理的: $sql = “SELE

DDOS、CC、sql注入,跨站攻击防御方法

web安全常见攻击解读--DDos.cc.sql注入.xss.CSRF 一,DDos https://www.cnblogs.com/sochishun/p/7081739.html#4111858 http://nic.swu.edu.cn/s/nic/thyt/20180604/2555404.html 1.1 DDos介绍 DDoS是英文Distributed Denial of Service的缩写,意即“分布式拒绝服务”.分布式拒绝服务攻击发起后,攻击网络包就会从很多DOS攻击源(俗称

php如何防止SQL注入

通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为#在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,等价于 select * from users where username='' or 1=1 SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏

【sql注入教程】SQL注入是什么?我们如何去玩转它

本文转自:i春秋社区 SQL注入攻击是黑客攻击数据库最常见手段之一.简单讲,SQL注入攻击是黑客利用网站程序漏洞,通过提交精心构造的SQL语句,以达到窃取数据库信息.修改破坏数据库为目的的攻击行为.SQL注入攻击方式非常隐蔽,不容易被察 觉,攻击成功所导致的后果严重,所以对网络安全危害巨大,对自己的网站都会造成不必要的损失,因此如何防范SQL注入攻击是很值得学习的, 很多人声称自己了解sql注入 但是他们听说经理的情况比较常见 sql注入是影响企业运营最具有破坏性的漏洞之一 他会泄露保存在应用程

Web常见安全漏洞-SQL注入

SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞. 可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作, 甚至有可能获取数据库乃至系统用户最高权限. 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码, 程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变, 额外的执行了攻击者精心构造的恶意代码. SQL注入实例 很多Web开发者

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.