欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

通过SQL注入得到WebShell的原理及步骤

程序员文章站 2022-09-09 08:24:54
一.通过SQL注入得到WEBSHELL的原理: N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据... 08-10-08...
一.通过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;