论坛: 编程破解 标题: jsp提交单眼号进数据库(以及数据库单眼号漏洞问题) 复制本贴地址    
作者: ljsh012 [ljsh012]    论坛用户   登录
这是我以前用jsp写一个留言簿时碰到的问题,后来七扯八扯还是被我搞对了,不过我也不知道是什么鸟原因?如何解释,我曾经发过一个帖叫人解释,286回答过那个帖子。但根本原因还是没说清楚。后来查过也没查到任何好的解释。现在把这个问题在完整的贴出来,希望对想要的人有所帮助。
当我们用jsp页面提交留言进数据库时(asp有个htmlencode方法,不涉及到这个问题)我们需要对提交的“<”等等进行编码,就是做个转换,当初留言簿写好后提交一些程序老出问题,后来一点点排除后才知道是'单眼号的问题,而要怎样替换这个单眼号,方法也想了好多,比如换成另外 一个不常用的字符等等,读出时再转换回来,但是,这些都不理想。后来我也是想起曾经看过单眼号漏洞的问题,我把替换改为:把一个单眼号替换为两个单眼号(注,此处谈到的单眼号都是英文输入法半角下)提交含有单眼号的留言后,成功了。跑去数据库一看,虽然把一个单眼号替换为两个单眼号提交,但是数据库理只接收到一个单眼号。
得到这个结果后,我就直接跑去数据库里用sql语句提交单眼号,n个单眼号,得出
想往数据库提交单眼号的话,只要把单眼号换成两个单眼号就行了。
比如:
insert into table (a,b,c) values ('a''b','''','a''')
数据库中的结果是a'b,',a'
我记得286回答说是两个单眼号视为',而一个单眼号就视为单眼号。(注意理解俄,这里不费口舌了),当然中间那个''''首先要首尾匹配才能套用上面的。
问题是:谁能给个非常详细的解释?(有关数据库了)
也不知道那些大型网站用jsp提交留言时是用什么方法搞定单眼号的?
说起数据库单眼号漏洞,
我顺便给大家说一说:
有一些留言簿在检查用户名或者密码时检测不严密
比如我们提交这样用户名和密码后
user:  a'or'1=1
pwd:    a'or'1=1
这个字符串在sql查寻语句中就变成这样了
'a'or'1=1'
想想看,结果会怎样,这个语句因为or 1=1永远都为真了。因为单眼好在匹配中完全符合sql语句,所以可以成功执行查寻不报错。(注意两头的单眼号是怎么多出来的,sql语句是用单眼号来区别字符串和语句的)
现在这个漏洞在半年前是非常的吃香的,看电影不要钱。现在不行了(但是依然可以进行成功查询,不过密码都已经md5加密了)。不过还有大部分的某些公司的留言簿仍然存在此漏洞。可以得到管理员身份。
今天有点时间,写写以上,或许对部分人有用。

地主 发表时间: 05-01-02 22:33

回复: kert_t8 [kert_t8]   论坛用户   登录
这个问题,咳咳,比较难,咳咳,我不是很清楚,不过试图通过下面的方法找到解决的途径(都写得什么呀?)

首先,如何处理双引号和单引号是一个普遍存在于程序设计语言里面的问题。常见的有两种解决的办法:一个是重复法,就是双写,单引号就是['']双引号就是[""];还有一种方法是转义法,比如使用[\']表示['],使用[\"]表示["]。
然后是可能不同的语言对于字符串的处理方法不一样,比如说可能(仅仅是可能)在Java里面采取[\']标识单引号,但是Oracle里面采用双写的方法(我不知道,搞忘了,错了不要打我),这样的话,如何使用Java进行对Oracle数据库的连接并提交查询语句就是一个很诡异的问题。因为两种语言处理方式不一样。但是这个诡异的问题也不难解决,实际上用Java提交一个Query相当于一个简单的语句生成器。只要注意到哪个字符串是提交到数据库里的Query(SQL语句),哪个字符串是在Host Language里面所实在储存并进行编辑操作的,就可以了(这几句话比较绕,如果我是高手的话就可以说这几句话比较精辟,大家要慢慢理解)。


所以,按我的理解,一个在Java里面提交查询语句的实例可以是:

查询条件可能是abc字段等于 ab'cd

设想中的语句可能是: select * from table_1 where abc='ab''cd';

而到Java当中可能就是:
代码:

String Query_1 = "select * from table where abc=\'ab\'\'cd\'";



[特此声明:以上语句由于条件限制,暂时无法进行验证,仅仅是提出想法而已,如果错误,概不负责,要是成功,阿弥陀佛]



B1层 发表时间: 05-01-04 12:41

回复: ljsh012 [ljsh012]   论坛用户   登录
你说的理论上应该就是那么回事.
但是起先我也用过\'来处理单眼号,但仍然报错。(分析一下如果用这中方法的话,估计成这样了\\'.这种仍然是错误的(在数据库中)。而此处的所述的单眼号仅仅是数据库处理单眼的缺陷。跟程序语言关系不大。(想在数据库中插入单眼号,转义符'\'是不行的,我查过数据库好像没有转义符,反正以前搜了半天找了半天也没找到,只能提交两个单眼号。我是在sql2000下)程序语言需要做的就是如何在满足sql语句的要求下做想做的事情。
注意此句

查询条件可能是abc字段等于 ab'cd

设想中的语句可能是: select * from table_1 where abc='ab''cd';


是基于程序处理了单眼号问题之后。即把一个单眼号替换为两个单眼号之后提交之后真正在数据库中执行的sql语句就是月之御者上面的。
而java中的对于单眼号的处理就是通过转义符,如月之御者所述,我觉得应该就是那样。

B2层 发表时间: 05-01-04 13:10

回复: cike [cike]   论坛用户   登录
我现在也在做,我的qq是17814316


B3层 发表时间: 05-01-04 23:35

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号