随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原理、攻击方式和防御策略。
SQL注入是一种臭名昭著的攻击方式,通过在输入框中插入恶意SQL语句,黑客可以绕过身份验证,进而访问、篡改或删除数据库中的数据。我们将探讨SQL注入的不同形式,以及如何通过正确的输入验证和参数化查询等手段来有效预防这类攻击。
另一方面,XXE注入则利用XML处理器解析XML输入时的弱点,使攻击者能够读取本地文件、发起远程请求等。我们将详细分析XXE注入的工作原理,并介绍如何使用安全的XML解析器配置来降低风险。通过了解这两种漏洞的内在机制,我们希望能够为开发者、安全从业者以及对网络安全感兴趣的人们提供关于Web应用安全的深度认识。在这个信息互联的时代,保护我们的Web应用免受SQL注入和XXE注入等威胁是至关重要的。
一、数据库基础
1、主流数据库简介
(1)、Microsoft SOL Server
①、SQL Server 是Microsoft 公司推出的关系型数据库管理系统
②、具有使用方便可伸缩性好与相关软件集成程度高等优点
③、从旧版本的个人电脑到运行Microsoft Windows server 的大型多处理器的服务器都可以使用
(2)、MySQL
MySQL是现在非常流行的的关系型数据库管理系统,在WEB应用方面MySOL是最好的RDBMS(Relational Database Management System: 关系数据库管理系统)应用软件之一。
(3)、MySQL数据库连接方法
①、命令行下连接: [root@host]# mysql-u root -p
②、PHP连接: mysqli_connect(host,username,password,dbname,port,socket);
③、第三方软件连接
(4)、Oracle
①、Oracle Database,又名Oracle RDBMS,或简称Oracle。
②、甲骨文公司的一款关系数据库管理系统。
③、在数据库领域一直处于领先地位的产品,在大公司的大型网络中运用非常多
(5)、PostgreSQL
①、PostgreSQL是一个功能强大的开源对象关系数据库管理系统 (ORDBMS)
②、稳定性极强,用于安全地存储数据
2、识别数据库方法
(1)、识别数据库方法
①、盲跟踪
--Web应用技术
--不同数据库SQL语句差异
②、非盲跟踪
--报错、直接查询
(2)、报错信息:
①、MySQL报错信息:
②、MSSQL报错信息:
③、Oracle报错信息:
(3)、利用字符串连接方式去匹配数据库产品:
(4)、利用特定数据库函数匹配数据库产品
(5)、利用特定数据库函数匹配数据库产品:
(6)、数据库版本查询
①、Mssql select @@version
②、MySQL select version( ) / select @@version
③、Oracle select banner from $version
④、Postgresql select version()
(7)、数据库版本查询
①、Oracle版本查询
②、Mysql版本查询
③、Mssql版本查询
(8)、数据库版本在字符串处理时的区别
(9)、根据网页编程语言去判断
常见的搭配 :
①、ASP和.NET: Microsoft SQL Server
②、PHP: MySOL、PostgreSQL
③、Java: Oracle、MySOL
3、SQL语法基础
(1)、表、列/字段、值的定义
①、数据库名: data.mdb
②、表: gmadmin、news (14) 、评论 (40).....
③、表gmadmin字段或列: id gmadmin gmpass
④、每个对应的字段都有对应的数据。
(2)、用于与关系型数据库交互的标准 SQL 命令有
CREATE、SELECT、INSERT、UPDATE、 DELETE 和 DROP
(3)、分为三组
①、数据定义(Create、Drop)
②、数据操纵(Select、Insert、Update、 Delete)
③、数据控制(Grant、Revoke)
(4)、SQL基本操作: CUD
①、C=Create 创建
CREATE DATABASE testdb;CREATE TABLE table name (column name column_type);
②、U=Update 更改
UPDATE table name SET field1=new-value1, field2=new-value2 [WHERE Clause]
③、D=Delete 删除
DELETE FROM table name[WHERE Clause]
(5)、SQL高级操作: 排序,分组,限定条数
①、排序 order by
SELECT *FROM test table ORDER BY userid;
②、分组 group by
SELECT name,COUNT(*) FROM test table GROUP BY name!
③、限定条数 limit
SELECT * FROM test table limit 0,10;SELECT * FROM test table limit 1,5:
④、组合使用
SELECT * FROM test table LIMIT 0,5 ORDER BY userid;
(6)、语句用法
①、order by用法: 用来确定字段数
order by:要是后面跟着的数字超出了字段数的时候,则会报错!通过这个可以确定字段数
②、limit用法
select * from table limit m,n 其中m是指记录开始的index,从0开始表示第一条记录 n是指从第m+1
条开始取n条
(1)、两个参数:第一个是偏移量,第二个是数目
select * from employee limit 3, 7; // 返回4-11行select * from employee limit 3,1;// 返回第4行
(2)、一个参数:
select * from employee limit 3;//返回前3行
③、group by 用法
group by语句:根据(by)一定的规则进行分组(Group)。
作用: 通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
注意:group by 是先排序后分组;
group by必须有“聚合函数” sum()、count()、avg()来配合才能使用
select product from orders
select product from orders GROUP BY product
错误查询语句: select product,price from orders group by product正确查询语句: select product,sum(price) from orders GROUP BY product
当查询语句同时出现了where、 group by、having、order by的时候,执行顺序和编写顺序是:
Ⅰ、执行where xx对全表数据做筛选,返回第1个结果集。
Ⅱ、针对第1个结果集使用group by分组,返回第2个结果集
Ⅲ、针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集
Ⅳ、针对第3个结集执行having xx进行筛选,返回第4个结果集
Ⅴ、针对第4个结果集排序
select product,sum(price) from orders GROUP BY product HAVING sum(price)>100 ORDERBY sum(price);
④、联合查询union
因为查询语句构造问题,可直接否认掉之前的查询,执行一个全新的语句来执行需要注意的是查询的列应当和之前对应,
用and union select 1,2,3,4,5,6...;来猜解列数(字段数),只有列数相等了,才能返回True
知道列名后,把列名至于其中任意位置,就能在那个位置暴出列的内容来
⑤、结合其他函数
Ⅰ、结合exists()函数猜解表名and exists (select.....)
exists()函数用于检查子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者False
不存在admin表
存在heihei表
Ⅱ、union 结合系统函数暴数据库信息
在MySOL中,把information schema看作是一个数据库,确切说是信息数据库。其中保存着关于MySOL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
information schema数据库是MvSOL自带的information_schema.SCHEMATA表中的SCHEMA NAME 查看所有的数据库select* from hehe where id=3 and 1=2 union select 0,0,SCHEMA_NAME frominformation ——schema.SCHEMATA limit 12;
Ⅲ、union 结合系统函数暴数据库信息
information_schema.TABLES 表中的TABLE_NAME和TABLE_SCHEMA查看所有的表名和所在的
数据库:
select TABLE NAME ,TABLE_SCHEMA from information_schema.TABLES where TABLE SCHEMA ="haha"
Ⅳ、结合load file()读取服务器文件内容
函数 LOAD_FILE(file name): 读取文件并将文件内容按照字符串的格式返回
前提条件:
(1)、文件的位置必须在服务器上,你必须为文件制定路径全名,而且你还必须拥有 FILE 特许权。
(2)、文件必须可读取,文件容量必须小于 max allowed_packet 字节
(3)、若文件不存在,或因不满足上述条件而不能被读取, 则函数返回值为 NULL。
load_file()用在MySQL中可以在UNOIN中充当一个字段,读取web服务器的文件
Ⅴ、示例:
服务器上文件:"d:/test.txt",里面内容是:"key:HelloWorld.",用load file读取出来
select * from hehe where id=3 and 1=2 union select 0,load_file("d:/testtxt"),count(*) from mysql.user;
4、挖掘SQL注入常用语句
(1)、使用逻辑进行确认
OR 1=1
OR 1=2
AND 1=1
AND 1=2
5、SQL注入漏洞利用
(1)、识别数据库
要想成功发动SQL注入攻击,首先要确定数据库的类型这样才能使得注入工作具有针对性
(2)、盲跟踪
Web应用技术
不同数据库Sql语句差异
(3)、非盲跟踪
报错、直接查询
(4)、关于数据库版本的查询
Mssql select @@versionMysql select version[]/ select @@versionOracle select banner from $versionPostgre sqlselect version()
(5)、使用UINON语句提取数据
SELECT column-1,column-2, ....,column-N FROM table-1 UNIONSELECT column-1,column-2, ..., column-N FROM table-2
(6)、如果允许重复的值,就要使用 UNION ALL
SELECT column-1,column-2, ..column-N FROM able-1UNION ALLSELECT column-1,column-2, ....column-N FROM table-2
(7)、匹配列
①、主要两种方法:
union select NULL,NULL,NULL..... 直到匹配对应列时返回为真order by 3, order by 4. order by 5......当列数小于或者等于当前列的时候返回正常
②、例如:
http://123.59.116.191/sqli-labs-master/Less-1/?id='union select 1,2,3-http://123.59.116.191/sqli-labs-master/Less-1/?id=1'order by 1 --http://123.59.116.191/sqli-labs-master/Less-1/?id=1'order by 2 --http://123.59.116.191/sgli-labs-master/Less-1/?id=1' order by 3 --
(8)、常见手工注入SQL语句:
查看数据库
union select 1,(select group_concat(schema name) from information_schema.schemata),'3>
查看 security 库数据表
union select 1,(select group_concat(table_name) from information_schema.tables wheretable schema='security'),'3
(9)、使用条件语句
IF condition THEN do something ELSE do something else
二、注入漏洞利用
1、SQL注入
(1)、什么是SQL注入漏洞
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令进而实现对后台数据库乃至整个应用系统的入侵。
(2)、SQL注入原理
SQL注入攻击的本质,服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全
(3)、注入的本质
对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。
(4)、两个条件
用户能够控制输入
原本程序要执行的SQL语句,拼接了用户输入的恶意数据
(5)、注入过程
(6)、SQL注入带来的危害
①、绕过登录验证:使用万能密码登录网站后台等
②、获取敏感数据:获取网站管理员帐号、密码等
③、文件系统操作: 列目录,读取、写入文件等。
④、注册表操作: 读取、写入、删除注册表等
⑤、执行系统命令: 远程执行命令
2、SQL注入示例
(1)、直接将前台动态参数拼接入SQL语句中。
攻击者可以构造出恶意的SQL语句进行其他操作
SELECT username, password FROM users WHERE username=’ ”+username +" ‘AND password='" + password +’”;
(2)、通过在用户名处传入参数' or 1=1 # 进行万能密码登陆
SELECT username, password FROM users WHERE username='textvalue' or=1 #' ANDpassword='textvalue2'
①、输入字符
formusr = ' or 1=1 --formpwd = anything
②、实际的查询代码
SELECT * FROM users WHERE username =''or 1=1 -- AND password = 'anything
(3)、判断一个HTTP请求是否存在SQL注入的方式:
①、经典: and 1=1 | and 2 > 1 | or1 =1 | or 1<1
②、数据库函数: and sleep(4)=1 | and length(user())>3
③、特殊符号: 单引号 (’) 双引号 (”)
3、SQL注入分类
(1)、注入类型
①、SQL注入: 攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗数据库服务器执行恶意的SQL命令
②、命令注入: 后端未过滤掉恶意数据,代码当做系统命令执行。
③、代码注入:一般出现在不安全的使用某些函数(例如文件包含、反序列化漏洞)
④、LDAP注入
LDAP (轻量级目录访问协议) ,用于访问网络中的目录服务,常用在ActiveDirectory,企业管理目录。
用户提交的输入不经验证插入LDAP搜索过滤器中,攻击者通过提交专门设计的输入修改过滤器的结构,以检索数据或执行未授权操作。
⑤、XML注入
(1)、XXE漏洞:引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
(2)、XPath注入: 与SQL注入类似,XPath解析器本身对URL、表单中提交的代码内容未作严格限制,导致恶意代码可以直接解析执行
(3)、XQuery注入
⑥、JSON注入: 轻量级的数据交换格式,主要利用特殊字符注入JSON中,造成解析失败
⑦、JSONP注入: 回调函数未作严格的检测和过滤
(2)、数字型注入
①、输入的参数为整数,如ID、年龄、页码等,如果存在注入型漏洞,则为数字型注入
http://www.testweb.com/user.php?id=8
②、存在数字型注入测试方法
(3)、字符型注入
①、输入的参数为字符串
②、与数组型注入的区别在于: 字符型注入一般要使用单引号来闭合
http://www.testweb.com/test.php?user=admin
③、存在字符型注入测试方法
(4)、搜索型注入
这类注入主要是指在进行数据搜索时没过滤搜索参数
一般在链接地址中有“keyword=关键字”,有的不显示的链接地址,而是直接通过搜索框表单提交。
此类注入点提交的 SQL 语句,其原形大致为:
select * from 表名 where 字段 like %关键字%
当我们提交注入参数为“keyword='and[查询条件] and'%'=',则向数据库提交的SQL语句为:select * from 表名 where 字段 like '% ' and[查询条件]and '%'='%'
4、造成SQL注入原因
(1)、动态字符串构建引起
①、不正确的处理转义字符 (宽字节注入)
②、不正确的处理类型 (报错泄露信息 )
③、不正确的处理联合查询
④、不正确的处理错误 (报错泄露信息)
⑤、不正确的处理多次提交 (二次注入)
(2)、后台存在的问题:
①、后台无过滤或者编码用户数据
②、数据库可以拼接用户传递的恶意代码
(3)、错误处理不当:
①、详细的内部错误消息显示给用户或攻击者
②、错误信息可以直接给攻击者提供下一步攻击帮助
(4)、不安全的数据库配置
①、默认账户:
SQL Server“sa”作为数据库系统管理员账户
MySOL使用“root”和“anonymous”用户账户
Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户
②、权限:
问题:系统和数据库管理员在安装数据库服务器时允许以roots SYSTEM或Administrator特权系统用户账户身份执行操作。
正确方法: 应该始终以普通用户身份运行服务器上的服务,降低用户权限,将用户权限只限于本服务
5、SQL注入过程
(1)、自动化注入工具
①、SQL注入工具:
Sqlmap Havij Sqlid
②、ASP,JSP注入工具:
NBSI 阿D注入软件 明小子注入软件
③、PHP注入工具:
穿山甲注入软件 海阳顶端注入软件
6、安全专家经常使用的SQL注入工具
(1)、BSQL Hacker
由Portcullis Labs开发,BSOL Hacker是一种自动化SOL注入框架,支持SQL盲注,定时盲注,深度盲注和错误识别盲注。
(2)、The Mole
Mole是一个开源工具,能够绕过一些使用普通过滤规则的IPS/IDS系统。通过Union和Boolean查询技术,Mole能够通过一个脆弱的URL或网站的一串字符就能侦查和实施注入。Mole的命令行工具支持攻击MySQL、SOL Server、Postgres和Oracle数据库。
(3)、Pangolin
与web安全漏洞扫描器JSky工具出自同一家公司--NOSEC,Pangolin是一个完整的SQL注入测试工具,有一个用户友好的GUI,能够攻击几乎市场上所有的数据库。Pangolin通常被白帽社区用作渗透测试工具
(4)、Sqlmap
号称自动化SQL注入和数据库接管工具,Sqlmap是开源工具,支持使用五中SQL注入技术攻击数据库,如果用户拥有DBMS账户、IP地址端口和数据库名称,则可以实施直接
攻击。可通过内置的字典攻击用户名密码哈希值。
(5)、Havij
Havij是在全球黑帽中非常流行的一个工具,由伊朗开发者开发,Havij在波斯语里是胡萝卜的意思(编者按: 暗指男根) 。Havij可攻击MySOL、Oracle、PostgreSQL、MSAccess和Sybase,攻击成功率号称有95%。
步骤1.Havii获取数据库类型与信息
Havij获取数据库cms内的表
步骤2.Havii获取网站管理员账号与密码
步骤3.MD5值破译哈希值
步骤4.登陆后台
步骤5.篡改文章或主页
步骤6.管理数据库
(6)、Safe3 SQL Injector
Safe3 SOL Injector是简单易用的自动化注入工具,可以自动侦测SOL注入漏洞并进行攻击,直至最后接管数据库。Safe3 SQL还能自动识别数据库类型,并选择最佳的SQL注入方法。
(7)、SQL Poizon
Safe3 SQL Injector是简单易用的自动化注入工具,可以自动侦测SQL注入漏洞并进行攻击,直至最后接管数据库。Safe3 SQL还能自动识别数据库类型,并选择最佳的SQL注入方法。
(8)、SQL注入工具利用实验(需要的话关注联系)
工具1:利用Sglmap注入cms
工具2:利用Havii注入cms
7、SQL手工注入过程
(1)、手工注入过程
①、判断是否存在注入点;
②、判断字段长度 ;
③、判断字段回显位置:
④、判断数据库信息 ;
⑤、查找数据库名;
⑥、查找数据库表;
⑦、查找数据库表中所有字段以及字段值
⑧、猜解账号密码;
⑨、登陆管理员后台
(2)、SQL手工注入实验
实验1:基于phpcms注入 (报错+get请求)
实验2: 基于sqli平台Less-1注入(报错+get请求)
8、寻找SQL注入
(1)、GET方法
①、GET是一种请求服务器的HTTP方法。
②、使用该方法时,信息包含在URL中
③、点击一个链接时,一般会使用该方法
(2)、GET请求方法,格式:
? text =valuel&cat=value2&num=value3 ..
(3)、修改方法:
①、浏览器的导航栏中直接修改即可操纵这些参数
②、HackBar插件
(4)、POST方法
①、POST是一种用于向Web服务器发送信息的HTTP方法
②、数据信息无法URL中看到
③、可以发送字节大的数据
POST /sqli-labs-master/Less-11/ HTTP/1.1Host: 123.59.116.191User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0Content-Type: application/x-www-form-urlencodedContent-Length: 43Connection: closeUpgrade-Insecure-Requests: 1uname=w3g43we&passwd=h64j4wj5&submit=Submit
(5)修改POST包方法
①、浏览器修改扩展(Hackbar)
②、代理服务器 (Burpsuite)
(6)、其它注入点数据
①、Cookie
②、Host
③、User-Agent
(7)、总结
只要后台接收前端输入的数据,并且未对数据进行过滤处理,最后直接进入到数据库中,从而都能构成威胁。
9、确认SQL注入
(1)、确认搜索类型
①、SELECT: 根据搜索条件从数据库中读取数据
②、INSERT: 将新数据插入到数据库中
③、UPDATE: 根据指定的条件更新数据中己有的数据
④、DELETE: 根据指定的条件删除数据库中己有的数据
(2)、确认数据类型
①、数字型:
SELECT* FROM products WHERE idproduct=3SELECT *FROM products WHERE value > 200SELECT *FROM products WHERE active = 1
②、字符型:
SELECT*FROM products WHERE name = Bike'SELECT*FROM products WHERE published date>'01/01/2013SELECT*FROM products WHERE published time>'01/01/2013 06:30:00'