URL攻击:顾名思义,就是利用URL来进行攻击,攻击方式就是更改地址栏中的$_GET的参数,另外进行一些必要的猜测,比如以下面的URL为例:
http://www.myfreax.com/category.php?category=mysql3
攻击者可以了更改后面的参数mysql3的数值,进行猜测,或者结合一些其它的手段,我所知道有两个个Linux发行版专做攻击工具的,和测试的,非常强大,都是基于ubuntu制作的
BackTrack #这个曾经在我学习Linux是安装过,专门用来攻击和渗透
blackbox Linux #这个就没有使用过了
下面就是实例了,
<?php
/**
*
* @author Freax
* @2014-3-24
* @contact huangyanxiong2013@gmail.com
*
*/
define( 'FREAX' , true);
require_once 'include/init.php' ;
'http://www.myfreax.com/category.php?category=PHP5' ;//正常url是这样的
class category{
/**
* 数据库 对象
* @var Object
*/
public $db ;
/**
* smarty 对象
* @var Object
*/
public $smarty ;
/**
* 地址 指向需要显示的页面
* @var String
*/
public $action ;
/**
* 分页类
* @var Object
*/
public $Page ;
/**
* 缓存id
* @var string
*/
public $cacheid ;
/**
* 初始化
* @var String
*/
public function __construct( $db , $smarty , $page ){ //做完这个函数就是将页面显示出来
$this ->db= $db ;
$this ->smarty= $smarty ;
$this ->Page= $page ;
$this ->getAtion();
$this ->getData();
$this ->display();
}
/**
* 获取地址 这个是非常关键的这里做的不得好也是攻击的机会
* 在在这个函数中,由于我只想获取到的是一个数字其它都是不要的,所以要将其它过滤
*/
public function getAtion(){
$bool =preg_match_all( '/\d+/' , $_SERVER [ 'QUERY_STRING' ], $match );
/* 如果按照我正常些的url来执行的话,根本就不要这个判断,也可以正常执行,
* 但是有意的人就会尝试更改这些参数 ,这里我需要获取到数据库分类的id,
* 并且使用这个id查询数据,难免不会受到sql攻击的,所以有这个判断*/
if (! $bool ) {
header( "HTTP/1.1 301 Moved Permanently" ); //攻击者更改参数后你将重定向404,或者其它相对安全的页面,不过建议还是重定向404静态页面,
//我这里是首页,因为我首页是不接受任何参数的
header( "location:http://" .WEB);
exit (); //记得要退出不然重定向后还是会执行的,因为php解释器没有看到结束标签\?\>
} else {
$this ->action= $match [0][0];
}
}
/**
* 获取缓存id
* @return string
*/
public function getcacheid(){
$this ->cacheid=(isset( $_GET [ 'category' ])? $_GET [ 'category' ]: '' ).@(isset( $_GET [ 'page' ])? $_GET [ 'page' ]: '' );
return $this ->cacheid;
}
/**
* 根据地址 获取对应的数据
* 根据地址判断smarty是否有缓存
* 没有缓存区数据库获取
* 赋值给模板
*/
public function getData(){
/* 这里根据cacheid判断是否存在缓存,如果没有缓存则从数据库中获取数据 ,由于cacheid在客户端也是可以更改的,
* http://www.myfreax.com/category.php?category=PHP2&page=23 这个url就是很形的了,一个是分类,一个是页数,
* 客户端可以随意更改页数,cacheid永远不同,生成的缓存,也会增多,只要来个循环,就生成N的文件缓存
* 为什么我这里可以随意更改$_GET参数都不会参数,都可以执行,因为$article=$this->db->selectArrs。。。。。。。。。。。。这个语句来说,即使没有从数据库中获取到数据也会返回空数组*/
if (! $this ->smarty->isCached( 'index.html' , $this ->getcacheid())){
$nav = $this ->db->selectArrs( 'select * from ' .PREFIX. 'class' );
$this ->Page->getTotalPageClass( $this ->db,PREFIX. 'article' , 'typeid' , $this ->action);
$this ->Page->getcurrPage();
$this ->Page->getStartPage();
$article = $this ->db->selectArrs( 'select ' .PREFIX. 'article.*,' .PREFIX. 'class.name from ' .PREFIX. 'article left join blog_class on (' .PREFIX. 'article.typeid=' .PREFIX. 'class.id) where typeid= ' . $this ->action. ' order by id desc limit ' . $this ->Page->startPage . ',' . $this ->Page->paging);
/* 所以这里就加上一个断
* */
if (! $article ) {
header( "HTTP/1.1 301 Moved Permanently" );
header( "location:http://" .WEB);
exit ();
}
$this ->Page->getLinkPage( 'category.php' );
$this ->Page->getClassPage( $article [0][ 'name' ]. $article [0][ 'typeid' ]);
$pagelink = $this ->Page->createPageLinks();
$navAtcion =@ $article [0][ 'name' ];
$this ->smarty->assign( 'articles' , $article );
$this ->smarty->assign( 'navs' , $nav );
$this ->smarty->assign( 'navAction' , $navAtcion );
$this ->smarty->assign( 'pagelink' , $pagelink );
}
}
/**
* 返回给前可以对模板进行一些操作
* 将数据返回给用户
*/
public function display(){
$this ->smarty->display( 'index.html' , $this ->getcacheid());
}
}
/**
* 实例化category类
*/
new category( $db , $smarty , $page );
?>