php中常见的sql攻击正则表达式汇总


Posted in PHP onNovember 06, 2014

本文实例讲述了php中常见的sql攻击正则表达式。分享给大家供大家参考。具体分析如下:

我们都已经知道,在MYSQL 5+中 information_schema库中存储了所有的 库名,表明以及字段名信息。故攻击方式如下:

1. 判断第一个表名的第一个字符是否是a-z中的字符,其中blind_sqli是假设已知的库名。
注:正则表达式中 ^[a-z] 表示字符串中开始字符是在 a-z范围内

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-z]' LIMIT 0,1) /*

2. 判断第一个字符是否是a-n中的字符

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*

3. 确定该字符为n

index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^n' LIMIT 0,1) /*

4. 表达式的更换如下

expression like this:  '^n[a-z]' -> '^ne[a-z]' -> '^new[a-z]' -> '^news[a-z]' -> FALSE

这时说明表名为news ,要验证是否是该表明 正则表达式为'^news$',但是没这必要 直接判断 table_name = 'news‘ 不就行了。

5.接下来猜解其它表了 只需要修改 limit 1,1 -> limit 2,1就可以对接下来的表进行盲注了。

例如:

$Exec_Commond  = "( \s|\S)*(exec(\s|\+)+(s|x)p\w+)(\s|\S)*";

$Simple_XSS = "( \s|\S)*((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)(\s|\S)*";

$Eval_XSS  = "( \s|\S)*((%65)|e)(\s)*((%76)|v)(\s)*((%61)|a)(\s)*((%6C)|l)(\s|\S)*";

$Image_XSS  = "( \s|\S)*((%3C)|<)((%69)|i|I|(%49))((%6D)|m|M|(%4D))((%67)|g|G|(%47))[^\n]+((%3E)|>)(\s|\S)*" ;

$Script_XSS = "( \s|\S)*((%73)|s)(\s)*((%63)|c)(\s)*((%72)|r)(\s)*((%69)|i)(\s)*((%70)|p)(\s)*((%74)|t)(\s|\S)*";

$SQL_Injection = "( \s|\S)*((%27)|(')|(%3D)|(=)|(/)|(%2F)|(")|((%22)|(-|%2D){2})|(%23)|(%3B)|(;))+(\s|\S)*";

sql攻击代码:

<?php 

function customError($errno, $errstr, $errfile, $errline) 

{ 

    echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />"; 

    die(); 

} 

set_error_handler("customError",E_ERROR); 

$getfilter="'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; 

$postfilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; 

$cookiefilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; 

function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq)

{    

    if(is_array($StrFiltValue)) 

    { 

        $StrFiltValue=implode($StrFiltValue); 

    } 

    if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1&&!isset($_REQUEST['securityToken']))

    { 

        slog("<br><br>操作IP: ".$_SERVER["REMOTE_ADDR"]."<br>操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交参数: ".$StrFiltKey."<br>提交数据: ".$StrFiltValue); 

        print "result notice:Illegal operation!"; 

        exit(); 

    } 

} 

foreach($_GET as $key=>$value)

{ 

    StopAttack($key,$value,$getfilter); 

} 

foreach($_POST as $key=>$value)

{ 

    StopAttack($key,$value,$postfilter); 

} 

foreach($_COOKIE as $key=>$value)

{ 

    StopAttack($key,$value,$cookiefilter); 

} 

   

function slog($logs) 

{ 

    $toppath="log.htm"; 

    $Ts=fopen($toppath,"a+"); 

    fputs($Ts,$logs."rn"); 

    fclose($Ts); 

} 

?>

sql分析:

如果使用这个函数的话,这个函数会绕开PHP的标准出错处理,所以说得自己定义报错处理程序(die())。
其次,如果代码执行前就发生了错误,那个时候用户自定义的程序还没有执行,所以就不会用到用户自己写的报错处理程序。 

那么,PHP里有一套错误处理机制,可以使用set_error_handler()接管PHP错误处理,也可以使用trigger_error()函数主动抛出一个错误。

set_error_handler()函数设置用户自定义的错误处理函数。函数用于创建运行期间的用户自己的错误处理方法。它需要先创建一个错误处理函数,然后设置错误级别。

 
关于的用法:

function customError($errno, $errstr, $errfile, $errline)

{
echo "<b>错误代码:</b> [${errno}] ${errstr}\r\n";

echo " 错误所在的代码行: {$errline} 文件{$errfile}\r\n";

   echo " PHP版本 ",PHP_VERSION, "(" , PHP_OS, ")\r\n";

// die();

}

set_error_handler("customError",E_ALL| E_STRICT);

总结

PHP遇到错误时,就会给出出错脚本的位置、行数和原因,有很多人说,这并没有什么大不了。但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。 有些网管干脆把PHP配置文件中的 display_errors 设置为 Off 来解决,但本人认为这个方法过于消极。有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。但是有了set_error_handler()之后,这些矛盾也都可以解决掉了。但是发现很少用这个函数。

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
php延迟静态绑定实例分析
Feb 08 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
php和vue配合使用技巧和方法
May 09 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 PHP
php中实现记住密码下次自动登录的例子
Nov 06 #PHP
php网站被挂木马后的修复方法总结
Nov 06 #PHP
调试PHP程序的多种方法介绍
Nov 06 #PHP
php实现singleton()单例模式实例
Nov 06 #PHP
php使用session二维数组实例
Nov 06 #PHP
php函数serialize()与unserialize()用法实例
Nov 06 #PHP
php实现webservice实例
Nov 06 #PHP
You might like
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
python字典序问题实例
2014/09/26 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Python实现代码块儿折叠
2020/04/15 Python
python变量的作用域是什么
2020/05/26 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
家具促销活动方案
2014/02/16 职场文书
银行贷款承诺书
2014/03/29 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js