a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 65|回复: 0

[其他] Oracle认证:SQL查询结果集对注入的影响

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
对于注入而言,错误提醒是极其主要。所谓错误提醒是指和正确页面分歧的结不美观反馈,高手是很正视这个一点的,这对于注入点的精准判定至关主要。本问谈判下关于几类错误和他发生的事理,但愿对读者有所辅佐。   错误提醒首要有逻辑错误和语法错误以及剧本运行错误三类。8 M* W$ W, P4 y2 U% l# M. g
一:逻辑错误
* q1 q  n. b& X( o8 H  简单的例子是1=1 1=2这两个,1=1与1=2页面分歧的事理是什么?以$sql = "select * from news where id=$_GET[id]"为例。0 i/ @5 V5 p6 b2 m: K
  select * from news where id=1 and 1=2发生的结不美观集为NULL,然后轨范取值得时辰,就会去出空值,无法显示。当然有的轨范发现SQL执行结不美观集为空,就当即跳转,效不美观就不显鸟。值得注重的是,有的如Oracle Postgresql的数据库在结不美观集为空情形下会再页面上默示字符型null字样,这算是个特点。如不美观使用or前提,好比( q8 S9 t5 c9 N, e! T9 D$ d0 [% D
  select * from news where id=1 or 1=1
( x4 X. ]3 P2 y0 t" Z( C  和and 1=2得结不美观正好相反,他的结不美观集十分复杂。如不美观SQL语句如斯,再加上轨范是轮回篡夺结不美观集(一些编程上的陋习)那么会掏出所有结不美观,结不美观可能运行很慢,在数据量巨年夜的Oracle上轻易呈现。这个例子会呈现什么呢,一般轨范掏出结不美观集中的第一条结不美观,那么很可能已经不是id=1的那条新闻了,这就是由些小菜奇异有时辰or 1=1页面会发生转变的原因。
# |- s5 r' @- F  归根到底,都是结不美观集分歧造成的,矫捷把握是关头,这并非纯挚的经验问题。
! R% P2 _6 ?  W$ \二:语法错误 7 B7 {: c; q5 F3 e; W0 i6 b
  语法错误时斗劲熟悉的,好比对于sql server,PgSQL,Sybase的注入错误提醒都很主要,因为操作它的特征来获守信息很快速。语法错误造成的结不美观可能是SQL错误而间断剧本执行,可是剧本或处事器设置屏障错误的情形下,轨范获得继续执行,可是结不美观集不存在,连NULL都算不上,反馈给抨击袭击者的很可能就是结不美观集为空的情形,其拭魅这是剧本的措置结不美观。当然Oracle PgSQL默示null。8 q3 a6 D0 H9 V4 c& n. \: q' E+ O' e3 T
三:运行错误不用说了,典型的就是操作MySQL注入benchmark让剧本运行超时获得物理路径,以及操作超时来获得分歧的表征进行盲注入。 + u; c$ N; C% R
四:逻辑错误和语法错误的连系。 / U. K* Q* v( o) I+ q
  当表征极不较着的时辰,操作近似iff这样的函数进行正确与否的区分有时辰会成救命稻草。因为语法错误和逻辑错误的表征年夜年夜都情形城市有分歧。
$ z# Y( Y: c' x) h% y  I  iff(1=1,1,'no')这个会发生结不美观1 注重是数字,而iff(1=2,1,'no')这个会发生'no' 是字符。那么
& B" i/ {& Q# n! i3 l3 G0 @  id=1 and 1=iff(1=1,1'no')正确是必然成立的,而id=1 and 1=iff(1=2,1,'no')会因为类型分歧发生语法错误。不外可惜的是似乎撑持iff函数的数据库不多,呵呵。- D' b- D+ `' V7 W
  此刻讲结不美观集在注入中的操作事理。
; m) D  X7 S" N+ I" P$ U一:年夜'or''='起头 / ~" ~( U" Y8 }# s
  这是进修SQL注入的初级课程,上岸裂痕。我简单年夜SQL结不美观集上剖析。
# m2 Y7 F4 R7 @- t# @  $sql = "select top 1 * from admin where username='$username' and password=md5('$password')";
) [- @( u& o0 Y3 a: q& n  显而易见,'or''='的插手使SQL语句返回了一标识表记标帜录,这才使验证经由过程。7 I7 n3 N5 a/ i5 Z0 @( {7 J& _
二:再看此刻的验证中的SQL / ]! ?8 C8 r* l9 g
  $sql = "select top 1 * from admin where username='$username'";: s  ]6 F, u8 a% Z  y+ D7 n4 E
  结不美观集不为空才按照采纳的记实集中的密码值与用户提交的密码MD5值进行比对来进行验证。这样,你俄然发现'or''='的计策失踪败鸟,可是后台明明有注入,这就是验证体例造成的。跟进这个验证过程,'or''='简直发生了一个结不美观集(admin表中的第一行记实)可是遗憾的事,后来的密码比对没法经由过程,验证无法成功。6 ~$ K" P5 L, p0 _6 w
  思绪很简单,网上有案例,我重在事理,操作union来发生想要的结不美观集。好比'and(1=2)union select top 1 username,'123456得md5值',id from admin where username='admin
, O# U: K$ }" ~) y  这样发生了admin的记实信息,可是记实集中的密码阿谁位置的值被替代成了123456的md5值,这样,使用admin 123456经由过程验证而且担任他的权力。* \8 f5 V) y% o( v$ g, T5 k" K
  更有甚者全数用'xxx'的体例来盲狙,这就很“过度”鸟。不外在sql2000 sybase这些严酷要求类型匹配的数据库来说,这样不能撼动“打点员上岸”的,因为执行时发生了语法错误,结不美观集为NULL。此外以前 ewebeditor注入裂痕来上传马也是这个union操作结不美观集来达到目的的经典案例。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 12:16 , Processed in 0.212531 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表