首页 > 安全 > 网站安全 >

SQL Injection渗透技术辅助总结之浅谈查询

2004-12-01

文章作者:冰血封情[EST]去过我的EvilOctal Weblog的兄弟都知道 在很久以前我的日程中就有这么一条总结injection中的union查询   但是由于课程太忙 一直没时间完成 到了今天 Injection都已经快是明日黄花了 业内各大站点都漏洞也修

文章作者:冰血封情[EST]
去过我的EvilOctal Weblog的兄弟都知道 在很久以前我的日程中就有这么一条
总结injection中的union查询

但是由于课程太忙 一直没时间完成 到了今天 Injection都已经快是明日黄花了 业内各大站点都漏洞也修补的差不多了 这种情势之下我要再写总结injection中的union查询那就要被人砍了...

好了 不多废话 我们今天来为红及一时的SQL Injection攻击手法做个辅助总结 总结所有的SQL查询语句 本文章总结的都是以MSSQL为准 文章是为方便广大学习者而写的 大家随便收藏转载 别把作者给撬了就好:)

查询语句是数据库的核心操作 在过去一年多以来 大大小小的SQL Injection攻击事件中 他也占据着不可磨灭的地位 其一般的格式为:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表名或者视图名>[,<表名或者视图名>]
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]];
呵呵 看见了够晕的吧?没关系 冰血来给你解释一下...
以上整个SELECT的意思是
根据WHERE子句的条件表达式从FROM子句指定的基本表或者视图中找出满足条件的元组 再按照SELECT子句中的目标列表达式 选出元组中的属性值形成结果表 如果有GROUP子句 则将结果按照<列名1>的值进行分组 该属性列值相等的元组为一组
如果GROUP组带有HAVING短语 则只有满足指定条件的组才输出 如果有ORDER子句 则结果表达还要按照<列名2>的值升序或者降序排列
是不是看着很抽象 没关系我们举例子来说 假设邪恶八进制文章系统的数据库是如下情况
用户表:EST_User(uid,name,pwd,group)
uid是文章系统工作人员的用户号;name是文章系统工作人员的用户名;pwd是对应用户名的密码列;group是文章系统中所属组
文章表:EST_Art(aid,aname,abody,atips,uid)
aid是文章在录入时候的编号;aname是存放文章题目的列;abody是用来存放文章正文的列;atips是文章所属于的分类

现在我们用它来做说明告诉大家如何使用查询语句 不过时间有限 大家通过例子来举一反三好了

单表查询
一 选择表中的若干列查询
1 查询指定列 查询全体工作人员的用户名和所在组
SELECT name, group FROM EST_User;
2 查询全部列 查询全体工作人员的详细记录
SELECT * FORM EST_User;
上面那句我们经常在一些源代码中看见 其实就是等价于SELECT uid, name, pwd, group FROM EST_User;
二 选择表中的若干元组
本来我们是简单的总结一下而已 这个我是不想讲它的 可惜可惜却想到有一些时候还真离不开它的一些用法 我也郁闷 大家来看看吧
1 查询满足条件的元组
这里我们主要讲比较大小和确定范围...
(1)比较大小
我们举个小例子 看这条语句 SELECT name, uid FROM EST_User WHERE uid<10; 它的意思是查询所有用户号小于10的文章系统工作人员的用户名以及用户号 当然 你使用 SELECT name, uid FROM EST_User WHERE NOT uid>=10;也可以
(2)确定范围
让我们来查询文章系统用户数据表中 用户号在5到10(包括5和10)之间的用户名 用户号和组 通过构造如下语句就可以了
SELECT name, uid, group FROM EST_User WHERE uid BETWEEN 5 AND 10;
那我们怎么表示不在5到10之间呢?呵呵 只要使用NOT BETWEEN就可以了 这里冰血封情不详细说了...
(3)多重条件
逻辑运算符AND和OR可以用来连接多个查询条件 另外AND的优先级是高于OR的 但是你可以使用括号来改变这种优先
我们举个例子...我们要查询斑竹组中所有用户号在10以下的用户的用户名 那么我们应该如何构造这个语句呢 呵呵 我自己写的都晕 够麻烦的...构造如下
SELECT name FROM EST_User WHERE group=Moderators AND uid<10;关于OR的各位老大你就自己多摸索 我要晕了 哈哈...

嵌套查询
在SQL中 一个SELECT-FROM-SELECT语句叫一个查询块 而将一个查询块嵌套在另外一个查询块的WHERE子句或者是HAVING短语的条件中的查询称之为嵌套查询 其实对Injection还是有点用的 所以这里也说说他吧...
比如:
SELECT name
FROM EST_User
WHERE uid IN
SELECT uid
FROM EST_Art
WHERE aid=8;
这样我们分开了看 首先 SELECT name FROM EST_User WHERE uid=; 这句 意思就是查询EST_User表中uid列值等于某个指定值的那个用户的名字
而 SELECT uid FROM EST_Art WHERE aid=8; 的意思就是说查询EST_Art表中aid等于8的那个文章的提交者的uid 把这个uid在发给上级查询 这样就完成了嵌套查询的过程...
一 带有EXISTS谓词的字查询
其实本类中也有好几种 但是为什么我只说EXISTS呢?因为它用的是比较多的 杂志上有相当一部分的GGDD使用injection的时候挺喜欢用它的 其实不是偶说 什么查询不查询 只要把数据库学好了 想怎么查怎么查 你看看lcx大哥多牛x呀?就得象他学习...又开始拍马P了-_-|||

EXISTS代表存在量词E(其实不是E 那个标志是个反过来的E 但是现在暂时找不到 就用个赝品替代了) 带有EXISTS谓词的字查询不返回任何数据 只产生逻辑真假值true或者是false
看见没有 这就是注入分子热忠于它的原因...
查询所有发过atips文章属性为Tech的工作人员姓名
SELECT name FROM EST_User WHERE EXISTS (SELECT * FROM EST_Art WHERE uid=EST_User.uid AND atips=Tech);
使用存在量词EXISTS后 如果内层查询结果非空 则外层WHERE子句返回真值 否则返回假值 而由EXISTS引出的子查询目标列的表达式一般都用* 因为此查询只返回真假 那么用了列名没什么意义...

集合查询
最后 咱们说说传说中的union查询 一直想总结的 都没空 这次带了一起 毙了算了 到这里冰血封情自己都要昏昏了 哈哈 写文章总结学历经验是件很快乐的事情 就象走在一条开满鲜花的小路 小路?哈哈 既然临时演员xiaolu出场就介绍一下吧!也是牛人哪 介绍完毕:P
其实集合查询也不只union一个 但是我们这里只说union 为什么?Hacking用的多呀 呵呵
例子来咯
假如我们要查询斑竹组的用户和用户号不大于8的用户 那么我们这里查询的就是这个的并集了 如何构造语句
SELECT * FROM EST_User WHERE group=Moderators UNION SELECT * FROM EST_User WHERE uid<=8;
哈哈 看来也不是很难么 具体就要看大家在实际中如何运用了...

好了 本次小小总结到这里就告一段落了 希望阅读本文的学习者能受到一点小小的启发 哪怕一丁点 冰血封情也很欣慰了呀:)
文章我写的浑浑噩噩 如果有错漏那可是一定一定的 为避免误人子弟 希望高手能出手戳一下小弟 欢迎来偶们的站点邪恶八进制 中国...问论坛地址?我才不说呢 有缘分自己找来呀...各位 回见了您哪:)


相关文章
最新文章
热点推荐