当前位置:首页 » 编程语言 » sql注入分为平台层注入
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql注入分为平台层注入

发布时间: 2023-04-09 01:46:42

① 常见的sql注入类型分为哪几种

根据输入的参数,可将SQL注入方式大致分为两类:数字型注入、字符型注入。
数字型注入:当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
字符型注入:当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

② java正则表达式怎么防止代码漏洞

javaWeb安全漏洞及处理方式
关注
转载自:https://blog.csdn.net/lujiancs/article/details/78175007

1、SQL注入攻击

SQL注入攻击就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设差举计者意图去执行SQL语句。

随着B/S框架结构在系统开发中的广泛应用,恶意攻击者利用SQL命令在Web表单中输入合法的字符或查询字符串来欺骗服务器执行SQL命令。当注入攻击得逞后,Web程序将泄露大量用户隐私数据和数据库中数据结构。攻击者能够获得系统较高的访问权限,进行破坏操作。

SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:

1)不当的类型处理;

2)不安全的数据库配置;

3)不合理的查询集处理;

4)不当的错误处理;

5)转义字符处理不合适;

6) 多个提交处理不当。

解决方法:

数据库安全通信包括SQL注入攻击的防范、安全设置、异常信息处理三个方面。

1.服务端Filter对访问者输入的字符进行过滤检验,但是攻击者经常把危险字符潜藏在用户输入的有效字符中完 成过滤检验。

2.通过正则表达式对页面的文本框输入的数据进行限制可以减少过滤检验存在的漏洞。

3.使用prepareStatment预编译sql语句

2、XSS跨站脚本攻击

跨站脚本(Cross-site scripting,简称XSS),是一种迫使Web站点回显可执行代码的攻击技术,而这些可执行代码由攻击者提供、最终为用户浏览器加载。不同于大多数攻击(一般只涉及攻击者和受害者),XSS涉及到三方,即攻击者、客户端与网站。XSS的攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。

XSS 属于被动式的攻击。攻击者先构造一个跨站页面,利用SCRIPT、<IMG>、<IFRAME>等各种方式使得用户浏览这个页面时,触发对被攻击站点的HTTP 请求。此时,如果被攻击者如果已经在被攻击站点登录,就会持有该站点cookie。这样该站点会认为被攻击者发起了一个HTTP请求。而实际上这个请求是在被攻击者不知情情况下发起的,由此攻击者在一定程度上达到了冒充被攻击者的目的。精心的构造这个攻击请求,可以达到冒充发文,夺取权限等多个攻击目的。在常见的攻击实例中,这个请求是通过script 来发起的,因此被称为Cross Site Script。

XSS漏洞成因是由于动态网页的Web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中掺入HTML代码(最主要的塌胡是“>”、“<”),然后未加编码地输出到第三方用户的浏览器,这些攻击者恶意提交代码会被受害用户的浏览器解释执行。

分为三种类型:

1)反射型(数据流向:浏览器 ->后端 -> 浏览器)

反射型XSS脚本攻击即如我们上面所提到的XSS跨站脚本攻击方式,该类型只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据。由于此种类型的跨站代码存在于URL中,所以黑客通常需要通过诱骗或加密变形等方式,将存在恶意代码的链接发给用户,只有用户点击以后才能使得攻击成功实施。

2)存储型(数据流向是:浏览器 ->后端 -> 数据库 -> 后端-> 浏览器)

存储型XSS脚本攻击是指Web应用程序会将用户输入的数据信息保存在服务端的数据库或其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,因此存储型XSS具有较强的稳定性。

存储型XSS脚本攻击最为常见的场景就是在博客或新闻发布系统中,黑客将包含有恶意代码的数据信息直虚衫碧接写入文章或文章评论中,所有浏览文章或评论的用户,都会在他们客户端浏览器环境中执行插入的恶意代码。

3)基于DOM(数据流向是:URL-->浏览器 )

基于DOM的XSS跨站脚本攻击是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击。不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。

解决方法:

1).输入过滤。对用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”等可能导致脚本注入的特殊字符,或者过滤“script”、“javascript”等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕开ASCII码,使用十六进制编码来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击。

2).输出编码。通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行.

3、CSRF跨站请求伪造漏洞防护

CSRF是CrossSite Request Forgery的缩写,乍一看和XSS差不多的样子,但是其原理正好相反,XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求。

字面理解意思就是在别的站点伪造了一个请求。专业术语来说就是在受害者访问一个网站时,其 Cookie 还没有过期的情况下,攻击者伪造一个链接地址发送受害者并欺骗让其点击,从而形成 CSRF 攻击。

根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。

解决方案:

配置FILTER拦截用户所有请求(POST/GET),对用户请求Referer头URL进行合法性校验。
4、URL链接注入漏洞防护

链接注入是修改站点内容的行为,其方式为将外部站点的 URL 嵌入其中,或将有易受攻击的站点中的脚本 的 URL 嵌入其中。将URL 嵌入易受攻击的站点中,攻击者便能够以它为平台来启动对其他站点的攻击,以及攻击这个易受攻击的站点本身。

解决方案:

1,二次验证,进行重要敏感操作时,要求用户进行二次验证。

2,验证码,进行重要敏感操作时,加入验证码。

3,验证 HTTP 的 Referer 字段。

4,请求地址中添加 Token 并验证。

5,HTTP 头中自定义属性并验证。
5、会话COOKIE中缺少HttpOnly防护

会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本、Applet等)获取到用户的cookie信息,造成用户cookie信息泄露,增加攻击者的跨站脚本攻击威胁。

HttpOnly是微软对cookie做的扩展,该值指定cookie是否可通过客户端脚本访问。Microsoft Internet Explorer 版本 6 Service Pack 1 和更高版本支持cookie属性HttpOnly。

如果在Cookie中没有设置HttpOnly属性为true,可能导致Cookie被窃取。窃取的Cookie可以包含标识站点用户的敏感信息。

如果在Cookie中设置HttpOnly属性为true,兼容浏览器接收到HttpOnly cookie,那么客户端通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这将有助于缓解跨站点脚本威胁。

解决方案:

配置filter拦截器,将服务器端返回请求,向所有会话cookie中添加“HttpOnly”属性。

示例代码:

HttpServletResponseresponse=(HttpServletResponse)paramServletResponse;

response.setHeader("SET-COOKIE","JSESSIONID=" + sessionid + "; HttpOnly");

6、点击劫持漏洞(Clickjacking)防护

点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

解决方案:

配置FILTER拦截器,在服务器端返回请求中,使用一个HTTP头“X-Frame-Options”值为SAMEORIGIN-同源策略 ,则frame页面的地址只能为同源域名下面的页面,防止点击劫持漏洞发生。

示例代码:

HttpServletResponseresponse=(HttpServletResponse)paramServletResponse;

response.addHeader("x-frame-options","SAMEORIGIN");

7、HTTP host 头攻击漏洞

使用HTTP代理工具,可以篡改HTTP报文头部中HOST字段时,该值可被注入恶意代码。因为需要控制客户端的输入,故该漏洞较难利用。

解决方案:

配置FILTER拦截器,对请求输入HOST头信息进行信息安全性校验,防止HOST头信息被恶意篡改利用。

示例代码:

HttpServletRequest request =(HttpServletRequest)servletRequest;
//主机ip和端口 或 域名和端口
String myhosts = request.getHeader("host");
if(!StringUtils.equals(myhosts, "xx.xx.xxx.xxx:xxxx")
!StringUtils.equals(myhosts, "xx.xx.xxx.xxx:xxxx")
!StringUtils.equals(myhosts,"xx.xx.xxx.xxx:xxxx")StringUtils.equals(myhosts,"xx.xx.xxx.xxx")
!StringUtils.equals(myhosts,"xx.xx.xxx.xxx") !StringUtils.equals(myhosts,"xx.xx.xxx.xxx" ){
logger.error("======访问host非法,已拦截======");
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
8、越权访问漏洞防护

越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,分为垂直越权访问和水平越权访问。垂直越权是指不同用户级别之间的越权,如普通用户执行管理员用户的权限。水平越权是指相同级别用户之间的越权操作。

Web应用程序如果存在越权访问漏洞,可能导致以下危害:

1)导致任意用户敏感信息泄露;

2)导致任意用户信息被恶意修改或删除。

解决方案:

配置FILTER拦截器,对请求所有URL进行拦截,对于需要进行授权的URL进行权限校验,防止用户越权访问系统资源。

9.弱口令漏洞

解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密,或者多种加密方式叠加组合。

10.JSP页面抛出的异常可能暴露程序信息。

有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。

解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。

11.本地缓存漏洞

合法用户“注销”后,在未关闭浏览器的情况下,点击浏览器“后退”按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。

解决方案:配置filter对存放敏感信息的页面限制页面缓存。如:

httpResponse.setHeader("Cache-Control","no-cache");

httpResponse.setHeader("Cache-Control","no-store");

httpResponse.setDateHeader("Expires",0);

httpResponse.setHeader("Pragma","no-cache");

12.文件上传漏洞。

前台仅使用JS对文件后缀做了过滤,这只能针对普通的用户,而恶意攻击者完全可以修改表单去掉JS校验。

13.Java WEB容器默认配置漏洞。

如TOMCAT后台管理漏洞,默认用户名及密码登录后可直接上传war文件获取webshell。

解决方案:最好删除,如需要使用它来管理维护,可更改其默认路径,口令及密码。

③ SQL注入步骤和常用函数以及中文处理方法

第一节 SQL注入的一般步骤 首先 判断环境 寻找注入点 判断数据库类型 这在入门篇已经讲过了 其次 根据注入参数类型 在脑海中重构SQL语句的原貌 按参数类型主要分为下面三种 (A)ID= 这类注入的参数是数字型 SQL语句原貌大致如下 Select * from 表名 where 字段= 注入的参数为ID= And [查询条件] 即是生成语句 Select * from 表名 where 字段= And [查询条件](B) Class=连续剧 这类注入的参数是字符型 SQL语句原貌大致概如下 Select * from 表名 where 字段= 连续剧 注入的参数为Class=连续剧 and [查询条件] and = 即是生成语句 Select * from 表名 where 字段= 连续剧 and [查询条件] and = (C) 搜索时没过滤参数的 如keyword=关键字 SQL语句原貌大致如下 Select * from 表名 where 字段like %关键字% 注入的参数为keyword= and [查询条件] and % = 即是生成语句 Select * from 表名 where字段like % and [查询条件] and % = % 接着 将查询条件替换成SQL语句 猜解表名 例如 ID= And (Select Count(*) from Admin)>= 如果页面就与ID= 的相同 说明附加条件成立 即表Admin存在 反之 即不存在(请牢记这种方法) 如此循环 直至猜到表名为止 表名猜出来后 将Count(*)替换成Count(字段名) 用同样的原理猜解字段名 有人会说 这里有一些偶然的成分 如果表名起得很复杂没规律的 那根本就没得玩下去了 说得很对 这世界根本就不存在 %成功的黑客技术 苍蝇不叮无缝的蛋 无论多技术多高深的黑客 都是因为别人的程序写得不严密或使用者保密意识不够 才有得下手 有点跑题了 话说回来 对于SQLServer的库 还是有办法让程序告诉我们表名及字段名的 我们在高级篇中会做介绍 最后 在表名和列名猜解成功后 再使用SQL语句 得出字段的值 下面介绍一种最常用的方法-Ascii逐字解码法 虽然这种方法速度很慢 但肯定是可行的方法 我们举个例子 已知表Admin中存在username字段 首先 我们取第一条记录 测试长度 ?id= and (select top len(username) from Admin)> 先说明原理 如果top 的username长度大于 则条件成立 接着就是> > > 这样测试下去 一直到条件不成立为止 比如> 成立 > 不成立 就是len(username)= 当然没人会笨得从 一个个测试 怎么样才比较快就看各自发挥了 在得到username的长度后 用mid(username N )截取第N位字符 再asc(mid(username N ))得到ASCII码 比如 id= and (select top asc(mid(username )) from Admin)> 同样也是用逐步缩小范围的方法得到第 位字符的ASCII码 注意的是英文和数字的ASCII码在 之间 可以用折半法加速猜解 如果写成程序测试 效率会有极大的提高 第二节 SQL注入常用函数 有SQL语言基础的人 在SQL注入的时候成功率比不熟悉的人高很多 我们有必要提高一下自己的SQL水平 特别是一些常用的函数及命令 Access asc(字符)SQLServer unicode(字符)作用 返回某字符的ASCII码Access chr(数字)SQLServer nchar(数字)作用 与asc相反 根据ASCII码返回字符Access mid(字符串 N L)SQLServer substring(字符串 N L)作用 返回字符串从N个字符起长度为L的子字符串 即N到N+L之间的字符串Access abc(数字)SQLServer abc (数字)作用 返回数字的绝对值(在猜解汉字的时候会用到)Access A beeen B And CSQLServer A beeen B And C作用 判断A是否界于B与C之间 第三节 中文处理方法 在注入中碰到中文字符是常有的事 有些人一碰到中文字符就想打退堂鼓了 其实只要对中文的编码有所了解 中文恐惧症 很快可以克服 先说一点常识 Access中 中文的ASCII码可能会出现负数 取出该负数后用abs()取绝对值 汉字字符不变 SQLServer中 中文的ASCII为正数 但由于是UNICODE的双位编码 不能用函数ascii()取得ASCII码 必须用函数unicode ()返回unicode值 再用nchar函数取得对应的中文字符 了解了上面的两点后 是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意 猜解范围大一点外 方法是没什么两样的 lishixin/Article/program/SQLServer/201311/22039

④ 什么是SQL注入,如何防止SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
防护
归纳一下,主要有以下几点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

⑤ sql注入发生在计算机网络的哪一层

应用层,每一层,这都有一定道理。
但其实SQL注入岩迹发生在服务器的业务逻辑粗宴并层,和计算机网络就没祥简有关系啊,你还需要学习一个。
你JS防,网络层防什么用没有,你只能在业务逻辑层防。

⑥ 什么是sql注入

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

⑦ 什么是SQL注入

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。
随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水平和经验参差不齐,相当一部分的开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行必要的合法性判断,导致了攻击者可以提交一段数据库查询代码,根据程序返回的结果,获得一些他想得到的数据。

SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现。
SQL注入攻击过程分为五个步骤:
第一步:判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注入问题,如:http://www.../162414739931.shtml就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://www...../webhp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。
第二步:寻找SQL注入点。完成上一步的片断后,就要寻找可利用的注入漏洞,通过输入一些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。

第三步:猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜测过程可以通过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。

第四步:寻找WEB管理后台入口。通常WEB后台管理的界面不面向普通用户

开放,要寻找到后台的登陆路径,可以利用扫描工具快速搜索到可能的登陆地址,依次进行尝试,就可以试出管理台的入口地址。

第五步:入侵和破坏。成功登陆后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。
SQL注入攻击的特点:

变种极多,有经验的攻击者会手动调整攻击参数,致使攻击数据的变种是不可枚举的,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。

攻击过程简单,目前互联网上流行众多的SQL注入攻击工具,攻击者借助这些工具可很快对目标WEB系统实施攻击和破坏。

危害大,由于WEB编程语言自身的缺陷以及具有安全编程能力的开发人员少之又少,大多数WEB业务系统均具有被SQL注入攻击的可能。而攻击者一旦攻击成功,可以对控制整个WEB业务系统,对数据做任意的修改,破坏力达到及至。

SQL注入的危害和现状

SQL注入的主要危害包括:

未经授权状况下操作数据库中的数据

恶意篡改网页内容

私自添加系统帐号或者是数据库使用者帐号

网页挂木马

如何防止SQL参数:
1,检查上传的数据,并过滤
2. 禁止拼接SQL字符串
3.使用SQL参数化处理
4.加载防入侵等硬件设施

⑧ 部分sql注入总结

本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。

在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,这是联合注入的前提。

适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库,因为MYSQL会有一个系统数据库information_schema, information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等

联合注入的过程:

判断注入点可以用and 1=1/and 1=2用于判断注入点

当注入类型为数字型时返回页面会不同,但都能正常执行。

sql注入通常为数字型注入和字符型注入:

1、数字型注入

数字型语句:

在这种情况下直接使用and 1=1/and 1=2是都可以正常执行的但是返回的界面是不一样的

2、字符型注入

字符型语句:

字符型语句输入我们的输入会被一对单引号或这双引号闭合起来。

所以如果我们同样输入and 1=1/and 1=2会发现回显画面是并无不同的。

在我们传入and 1=1/and 1=2时语句变为

传入的东西变成了字符串并不会被当做命令。

所以字符型的测试方法最简单的就是加上单引号 ' ,出现报错。

加上注释符--后正常回显界面。

这里还有的点就是sql语句的闭合也是有时候不同的,下面是一些常见的

这一步可以用到order by函数,order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次类推,所以可以利用order by就可以判断列数。

以字符型注入为例:

在列数存在时会正常回显

但是列数不存在时就会报错

这步就说明了为什么是联合注入了,用到了UNION,UNION的作用是将两个select查询结果合并

但是程序在展示数据的时候通常只会取结果集的第一行数据,这就让联合注入有了利用的点。

当我们查询的第一行是不存在的时候就会回显第二行给我们。

讲查询的数据置为-1,那第一行的数据为空,第二行自然就变为了第一行

在这个基础上进行注入

可以发现2,3都为可以利用的显示点。

和前面一样利用union select,加上group_concat()一次性显示。

现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了

报错注入的利用步骤和联合注入一致,只是利用函数不同。

以updatexml为例。

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target: 需要操作的xml片段

xpath_expr: 需要更新的xml路径(Xpath格式)

new_xml: 更新后的内容

此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。

这个函数当xpath路径错误时就会报错,而且会将路径内容返回,这就能在报错内容中看到我们想要的内容。

而且以~开头的内容不是xml格式的语法,那就可以用concat函数拼接~使其报错,当然只要是不符合格式的都可以使其报错。

[极客大挑战 2019]HardSQL

登录界面尝试注入,测试后发现是单引号字符型注入,且对union和空格进行了过滤,不能用到联合注入,但是有错误信息回显,说明可以使用报错注入。

利用updatexml函数的报错原理进行注入在路径处利用concat函数拼接~和我们的注入语句

发现xpath错误并执行sql语句将错误返回。

在进行爆表这一步发现了等号也被过滤,但是可以用到like代替等号。

爆字段

爆数据

这里就出现了问题flag是不完整的,因为updatexml能查询字符串的最大长度为32,所以这里要用到left函数和right函数进行读取

报错注入有很多函数可以用不止updatexml一种,以下三种也是常用函数:

堆叠注入就是多条语句一同执行。

原理就是mysql_multi_query() 支持多条sql语句同时执行,用;分隔,成堆的执行sql语句。

比如

在权限足够的情况下甚至可以对数据库进行增删改查。但是堆叠注入的限制是很大的。但是与union联合执行不同的是它可以同时执行无数条语句而且是任何sql语句。而union执行的语句是有限的。

[强网杯 2019]随便注

判断完注入类型后尝试联合注入,发现select被过滤,且正则不区分大小写过滤。

那么就用堆叠注入,使用show就可以不用select了。

接下去获取表信息和字段信息

那一串数字十分可疑大概率flag就在里面,查看一下

这里的表名要加上反单引号,是数据库的引用符。

发现flag,但是没办法直接读取。再读取words,发现里面有个id字段,猜测数据库语句为

结合1'or 1=1#可以读取全部数据可以利用改名的方法把修改1919810931114514为words,flag修改为id,就可以把flag读取了。

最终payload:

盲注需要掌握的几个函数

在网页屏蔽了错误信息时就只能通过网页返回True或者False判断,本质上是一种暴力破解,这就是布尔盲注的利用点。

首先,判断注入点和注入类型是一样的。

但是盲注没有判断列数这一步和判断显示位这两步,这是和可回显注入的不同。

判断完注入类型后就要判断数据库的长度,这里就用到了length函数。

以[WUSTCTF2020]颜值成绩查询为例

输入参数后,发现url处有个get传入的stunum

然后用到length函数测试是否有注入点。

发现页面有明显变化

将传入变为

页面回显此学生不存在

那么就可以得出数据库名长度为3

测试发现过滤了空格

然后就是要查数据库名了,这里有两种方法

一、只用substr函数,直接对比

这种方法在写脚本时可以用于直接遍历。

二、加上ascii函数

这个payload在写脚本时直接遍历同样可以,也可用于二分法查找,二分法速度更快。

接下来的步骤就和联合注入一样,只不过使用substr函数一个一个截取字符逐个判断。但是这种盲注手工一个一个注十分麻烦所以要用到脚本。

直接遍历脚本

二分法脚本

时间盲注用于代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息

语句执行后也不提示真假,我们不能通过页面的内容来判断

所以有布尔盲注就必有时间盲注,但有时间盲注不一定有布尔盲注

时间盲注主要是利用sleep函数让网页的响应时间不同从而实现注入。

sql-lab-less8:

无论输入什么都只会回显一个you are in...,这就是时间盲注的特点。

当正常输入?id=1时时间为11毫秒

判断为单引号字符型注入后,插入sleep语句

明显发现响应时间为3053毫秒。

利用时间的不同就可以利用脚本跑出数据库,后续步骤和布尔盲注一致。

爆库

爆表

爆字段

脚本

在进行SQL注入时,发现union,and,or被完全过滤掉了,就可以考虑使用异或注入

什么是异或呢

异或是一种逻辑运算,运算法则简言之就是:两个条件相同(同真或同假)即为假(0),两个条件不同即为真(1),null与任何条件做异或运算都为null,如果从数学的角度理解就是,空集与任何集合的交集都为空

即 1^1=0,0^0=0,1^0=1

利用这个原理可以在union,and,or都被过滤的情况下实现注入

[极客大挑战 2019]FinalSQL

给了五个选项但是都没什么用,在点击后都会在url处出现?id。

而且union,and,or都被过滤

测试发现?id=1^1会报错

但是?id=1^0会返回?id=1的页面,这就是前面说的原理,当1^0时是等于1的所以返回?id=1的页面。

根据原理写出payload,进而写出脚本。

爆库

爆表

爆字段

据此可以写出基于异或的布尔盲注脚本

实验推荐:课程:SQL注入初级(合天网安实验室)