精华内容
下载资源
问答
  • sql攻击演示SQL攻击

    2015-10-29 07:08:16
    什么是SQL攻击(也叫防sql注入) 在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段...
    什么是SQL攻击(也叫防sql注入)
    在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段!
    演示SQL攻击

    首先我们需要创建一张用户表,用来存储用户的信息。

    CREATE TABLE user(

             uid   CHAR(32) PRIMARY KEY,

             username        VARCHAR(30) UNIQUE KEY NOT NULL,

             PASSWORD    VARCHAR(30)

    );

     

    INSERT INTO user VALUES('U_1001', 'zs', 'zs');

    SELECT * FROM user;


    现在用户表中只有一行记录,就是zs。下面我们写一个login()方法!

    public void login(String username, String password) {

           Connection con = null;

           Statement stmt = null;

           ResultSet rs = null;

           try {

               con = JdbcUtils.getConnection();

               stmt = con.createStatement();

               String sql = "SELECT* FROM user WHERE " +

                      "username='" + username +

                      "' andpassword='" + password + "'";

               rs = stmt.executeQuery(sql);

               if(rs.next()) {

                  System.out.println("欢迎" + rs.getString("username"));

               } else {

                  System.out.println("用户名或密码错误!");

               }

           } catch (Exception e) {

               throw new RuntimeException(e);

           } finally {

               JdbcUtils.close(con, stmt, rs);

           }     

        }

    下面是调用这个方法的代码:

    login("a' or 'a'='a", "a' or 'a'='a");


    这行当前会使我们登录成功!因为是输入的用户名和密码是SQL语句片段,最终与我们的login()方法中的SQL语句组合在一起!我们来看看组合在一起的SQL语句:

    SELECT * FROM tab_user WHERE username='a' or 'a'='a' and password='a' or 'a'='a'


    防止SQL攻击

       过滤用户输入的数据中是否包含非法字符;

       分步交验!先使用用户名来查询用户,如果查找到了,再比较密码;

      使用PreparedStatement。



    展开全文
  • 基于约束的SQL攻击

    千次阅读 2020-01-20 17:53:29
    首先需要注意的是,本文所述的是基于约束的SQL攻击而非SQL注入攻击 碰到这个问题,是在做CTF题时碰到的(题目网址:http://123.206.31.85:49163/) 这一道题是要求我们以管理员admin的身份登陆系统方可查看flag...

    首先需要注意的是,本文所述的是基于约束的SQL攻击而非SQL注入攻击

    碰到这个问题,是在做CTF题时碰到的(题目网址:http://123.206.31.85:49163/) 

    这一道题是要求我们以管理员admin的身份登陆系统方可查看flag,方法就是在注册时注册一个admin (admin后面带一个或几个空格),然后登录系统,系统会误认为是管理员登录了系统,所以赋予管理员权限。

    那么,就算我们采用PHP中的PDO以及预查寻的方式(详见简单的PDO技术以及预处理方法预防SQL注入)来处理是否能预防基于约束的SQL攻击呢?这里给出靶场的源代码,环境使用的是Windows上的phpstudy(php-5.6.27+apache)

    前端代码loginPDO.php

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title>登录界面</title>
    	</head>
    	<body>
    		<form action = "actionPDO.php" method = "post">
    			<div id = "main" class = "main">
    				<center>
    					<h2>
    						登录
    					</h2>
    					<p><lable>用户名称:</lable><input type="text" name="userName" placeholder="*************"></p>
    					<p><lable>用户密码:</lable><input type="text" name="userPassword" placeholder="*************"></p>
    				
    					<input type="submit" name="submit" value="登录">
    					<input type="reset" value="清空">
    				</center>	
    		</form>	
    
    		<form action = "registerPDO.php" method = "post">
    			<center>
    				<h2>
    					注册
    				</h2>
    					<p><lable>用户名称:</lable><input type="text" name="userName" placeholder="*************"></p>
    					<p><lable>用户密码:</lable><input type="text" name="userPassword" placeholder="*************"></p>
    					<input type="submit" name="submit" value="注册">
    					<input type="reset" value="清空">
    			</center>
    		</form>
    	</body>
    </html>

    注册模块代码registerPDO.php

    <?php
    	$name = $_POST['userName'];
    	$password = $_POST['userPassword'];
    	if($name == null || $password == null){
    		header("location:loginPDO.php");
    		return;
    	}
    	try {
    	    //创建PDO对象
    	    $pdo = new PDO("mysql:host=localhost;dbname=php10", "root", "root");
    	}catch(PDOException $e) {
    	    echo "数据库连接失败:".$e->getMessage();
    	    exit;
    	}
    	$sql = "INSERT INTO loginPDO(userName,userPassword) VALUES (?,?)";
    	//$sql = "INSERT INTO loginPDO(userName,userPassword) VALUES (:userName,:userPassword)";
    	$stmt = $pdo->prepare($sql);
    	$stmt->bindParam(1,$name);
    	$stmt->bindParam(2,$password);
    	//$stmt->bindParam(":userName",$name);		//绑定 一个 PHP 变量到预处理语句中对应的命名占位符或问号占位符
    	//$stmt->bindParam(":userPassword",$password);
    	$pdo->quote($name);
    	$pdo->quote($password);
    	$result = $stmt->execute();
    		if($result){
    			echo "<script>alert('注册成功')</script>";
    			echo "<h2>注册成功!,即将跳转至登录页面...</h2>";
    			header("refresh:3; url = //localhost/loginPDO.php");
    		}else{
    			echo "<script>alert('注册值错误!')</script>";
    			echo "<h2>注册失败,用户名已经注册或注册值为空...</h2>";
    		}
    ?>
    

     登陆模块actionPDO.php

    <?php
    	$name = $_POST['userName'];
    	$password = $_POST['userPassword'];
        if($name == null || $password == null){
    		header("location:loginPDO.php");
    		return;
    	}
    	try {
    	    //创建对象
    	    $con = new PDO("mysql:host=localhost;dbname=php10", "root", "root");
    	}catch(PDOException $e) {
    	    echo "数据库连接失败:".$e->getMessage();
    	    exit;
    	}
    	$sql = "SELECT * FROM loginPDO WHERE userName = :userName AND userPassword = :userPassword";
    	//$sql = "SELECT * FROM login WHERE userName = ? AND userPassword = ?";
    	$stmt = $con->prepare($sql);
    	$stmt->bindParam(':userName',$name);    //bindParam方法与bindValue方法的区别在于bindParam的第二个参数可以传值用变量,而bindValue第二个参数只能传值用常量或字符串
    	$stmt->bindParam(':userPassword',$password);
    	//$stmt->bindParam('1',$name);
        //$stmt->bindParam('2',$password);
    	$con->quote($name);          //quote方法是为普通的字符串添加引号
    	$con->quote($password);
    	$re=$stmt->execute();
    	if($stmt->rowCount()!=0){
    		echo "<script>alert('登录成功!')</script>";
    		echo "<h2>欢迎您{$name}</h2>";
    	}else{
    		echo "<script>alert('登录失败!')</script>";
    		echo "<h2>登录失败,3秒后自动跳转...</h2>";
    		header("refresh:3; url = //localhost/loginPDO.php");
    	}
    ?>

    靶场效果如下

    根据数据库中的初始数据,账号admin,密码root可以成功登录,注册不允许有相同的用户名。

    首先我尝试了在admin后面加一个空格,密码不变,提示登录成功

     

           然后尝试注册一个后面带空格的admin,结果提示注册失败,注册用户已存在,并不像刚开始所期望的那样。于是我猜测是否是因为bindParam()在绑定参数的时候去掉了末尾的空格,于是开始翻阅php手册,结果并没有发现手册中有提到bindParam()会去掉参数的首尾空格

           于是换一个方式,登录时在admin前面加一个空格,密码不变,点击登录提示登陆失败

     

    再注册一个admin前有一个空格的用户,结果发现注册成功

     

     

           那么猜测应该是成立的,bindParam()会截断绑定参数值后面的空格,而不会截断前面的空格,也就是允许注册用户名的第一个字符为空格

     

           也就是说,在一个有严格权限区分的系统,如果得知了管理员的用户名,可以利用管理员用户名后加空格的方法注册,再登录,系统也会默认为管理员,类似CTF的这道题一样,产生基于约束的SQL攻击

     

    防御方法

    1、使用过滤空格的函数,$data = trim($data),去掉传入参数的首位空格,再进行数据库查询、插入等工作

    2、对用户名的长度进行限制

    3、验证成功后返回的必须是用户传递进来的用户名,而不是从数据库取出的用户名。因为当我们以用户admin和密码root登陆时,其实数据库返回的是我们自己的用户信息,而我们的用户名其实是[admin      ],如果此后的业务逻辑以该用户名为准,那么就不能达到越权的目的了。

    4、将要求或者预期具有唯一性的那些列加上UNIQUE约束

    5、使用id作为数据库表的主键并设置自动递增,并且数据应该通过程序中的id进行跟踪

    展开全文
  • SQL 注入式攻击技术,一般针对基于 Web 平台的应用程序或者APP程序 由于程序员在编写 Web 程序时,没有对浏览器端提交的参数进行严格的过滤和判断。 用户可以修改构造参数,提交 SQL 查询语句,并传递至服务器端...

    攻击原理

    sql注入危害概述

    	只要前段与数据库有交互的都有可能出现问题
    	SQL 注入式攻击技术,一般针对基于 Web 平台的应用程序或者APP程序
    	由于程序员在编写 Web 程序时,没有对浏览器端提交的参数进行严格的过滤和判断。
    	用户可以修改构造参数,提交 SQL 查询语句,并传递至服务器端,
    	从而获取想要的敏感信息,甚至执行危险的代码或系统命令。
    

    注射式攻击的原理

    	注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。
    	这使得攻击者有机会将程序命令当作用户输入的数据提交给 Web 程序,以发号施令,
    	为所欲为(注:注入最终是数据库,与脚本、平台无关)。
    	总结:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作
    

    三件准备工作

    			为了发动注射攻击,攻击者需要在常规输入中混入将被解释为命令的“数据”
    			,要想成功,必须要做三件事情:
    

    确定 Web 应用程序所使用的技术

    					注射式攻击对程序设计语言或者硬件关系密切,
    					但是这些可以通过适当的踩点或者索性 将所有常见的注射式攻击都搬出来逐个试一下就知道了。
    					为了确定所采用的技术,攻击者可 以考察 Web 页面的页脚,查看错误页面,
    					检查页面源代码,或者使用诸如 Nessus、AWVS、 APPSCAN 等工具来进行刺探。 
    

    确定所有可能的输入方式

    		Web 应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如 HTML 表单; 
    		另外,攻击者可以通过隐藏的 HTML 表单输入、HTTP 头部、cookies、甚至对用户不可见的 后端AJAX 请求来跟 Web 应用进行交互。
    		一般来说,所有 HTTP 的 GET 和 POST 都应当作用户输入。
    		为了找出一个 Web 应用所有可能的用户输入,我们可以求助于 Web 代理,如 Burp 等。
    

    查找可以用于注射的用户输入

    在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。
    这个任务好像有点难,但是这里有一个小窍门,那就是多多留意 Web 应用的错误页面,
    很多时候您能从这里得到意想不到的收获
    

    经典万能密码原理(想起一张表情包)

    在这里插入图片描述
    经典 OR 漏洞原理解析
    SELECT * FROM admin WHERE Name=’ 'or 1=1–

    --为注释后面内容 针对asps 不同语法注释不同
    				详细请看: http://chengkers.lofter.com/post/14c64b_379726
    
    展开全文
  • 1 什么是SQL攻击 在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段! 2 演示...

    1 什么是SQL攻击

    在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段!


    2 演示SQL攻击

    首先我们需要创建一张用户表,用来存储用户的信息

    CREATE TABLE user(

             uid   CHAR(32) PRIMARY KEY,

             username        VARCHAR(30) UNIQUE KEY NOT NULL,

             PASSWORD    VARCHAR(30)

    );

     

    INSERT INTO user VALUES('U_1001', 'zs', 'zs');

    SELECT* FROM user;


      

    现在用户表中只有一行记录,就是zs。

    下面我们写一个login()方法!

    public void login(String username, String password) {
    		Connection con = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		try {
    			con = JdbcUtils.getConnection();
    			stmt = con.createStatement();
    			String sql = "SELECT * FROM user WHERE " +
    					"username='" + username + 
    "' and password='" + password + "'";
    			rs = stmt.executeQuery(sql);
    			if(rs.next()) {
    				System.out.println("欢迎" + rs.getString("username"));
    			} else {
    				System.out.println("用户名或密码错误!");
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		} finally {
    			JdbcUtils.close(con, stmt, rs);
    		}		
    	}
    

    下面是调用这个方法的代码:

    login("a' or 'a'='a", "a' or 'a'='a");

    这行当前会使我们登录成功!因为是输入的用户名和密码是SQL语句片段,最终与我们的login()方法中的SQL语句组合在一起!我们来看看组合在一起的SQL语句:

    SELECT * FROM tab_user WHERE username='a' or 'a'='a' and password='a' or 'a'='a'

    3 防止SQL攻击

    过滤用户输入的数据中是否包含非法字符;

    分步交验!先使用用户名来查询用户,如果查找到了,再比较密码;

    使用PreparedStatement。


    4 PreparedStatement是什么?

    PreparedStatement叫预编译声明!

    PreparedStatement是Statement的子接口,你可以使用PreparedStatement来替换Statement。

    PreparedStatement的好处:

    防止SQL攻击;

    提高代码的可读性,以可维护性;

    提高效率 。



    5 PreparedStatement的使用

      使用Connection的prepareStatement(Stringsql):即创建它时就让它与一条SQL模板绑定;

      调用PreparedStatement的setXXX()系列方法为问号设置值

      调用executeUpdate()或executeQuery()方法,但要注意,调用没有参数的方法;


    String sql = “select * from tab_student where s_number=?”;
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setString(1, “S_1001”);
    ResultSet rs = pstmt.executeQuery();
    rs.close();
    pstmt.clearParameters();
    pstmt.setString(1, “S_1002”);
    rs = pstmt.executeQuery();
    


    在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所谓SQL模板就是有“?”的SQL语句,其中“?”就是参数。

    在得到PreparedStatement对象后,调用它的setXXX()方法为“?”赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery()方法获取ResultSet对象。

    注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。

    PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它。这才是真正提高效率的原因。


    展开全文
  • 什么是SQL攻击

    2019-04-14 00:05:58
    在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段! ...
  • Ø 防SQL攻击; Ø 提高代码的可读性、可维护性; Ø 提高效率! l 学习PreparedStatement的用法: Ø 如何得到PreparedStatement对象: ¨ 给出SQL模板! ¨ 调用Connection的PreparedStatement ...
  • 约束的sql攻击

    2018-08-21 20:15:06
    mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 下列字符受影响: \x00 \n \r \ ' " \x1a 如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。 在sql执行字符串...
  • sql攻击,无非就是代码写的不严谨,或者就是开源代码惹的祸。  今 天遇到一个问题,发现某个表的数据无法读取,例如user表,于是进了数据库,开始和hack的战争之路。 1. 首先进去数据库,查看这个表是否正常,...
  • 网络攻击(SQL攻击、XSS、CSRF、DDos)

    千次阅读 2018-03-14 18:59:58
    1) SQL注入攻击(SQLInjection)攻击方法: 攻击者在HTTP请求中注入恶意SQL命令,服务器用请求参数构造数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。防范方法: 1. 检查变量数据类型和格式,过滤特殊语句和...
  • 当国外的黑客们信手玩弄SQL攻击时,国内互联网还处于风平浪静的态势,但当中国黑客们真正开始注入之旅时,绝大多数网站的噩梦随之而至。你可能会怀疑国内站长们所作的安全工作,但事实上,做好SQL攻击防范是非常复杂...
  • springboot中防止sql注入 & 防止sql攻击

    万次阅读 2018-07-11 21:23:16
    转自:https://blog.csdn.net/jancislo/article/details/80847104总结:sql注入就是 在请求参数中传入sql的关键字 防止sql注入可以采用过滤器,替换掉请求中的关键字原文:1.编写 ...
  • Mysql分页负数sql攻击

    千次阅读 2015-05-23 16:52:42
    1 攻击分析 CleverCode的运维同事给我说,他在查看mysql的错误日志的时候,发现有大量的下图的错误,所以有人是在正对某个地址进行攻击。大量出现这个错误的原因是mysql在limit不支持负数。通常我们分页的时候,...
  • 甲骨文发布了该公司的第一款...该产品能够实时监控非授权侵入、SQL攻击。 甲骨文数据库安全部门副总裁瑞平萨马表示,数据库威胁的不断变化要求企业采用新的安全解决方案。 甲骨文(Database Firewall)数据库防火墙
  • 需要用到JUnit测试import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; ...
  • 2. 在任意INSERT查询中,SQL会根据varchar(n)来限制字符串的最大长度,也就是说,如果字符串的长度大于“n”个字符的话,那么仅使用字符串的前“n”个字符。例如,如果特定列的长度约束为“5”个字符,那么在插入...
  • 使用 sp_executesql 建议您在执行字符串时,使用 sp_executesql 存储过程而不要使用 EXECUTE 语句。由于此存储过程支持参数替换,因此 sp_executesql 比 EXECUTE 的功能更多;由于 SQL Server 更可能重用 sp_exe
  • 老外安全公司发现了来自Google机器人的SQL注入攻击,迫使他们应急的时候设置策略对Google的IP进行屏蔽。   有件事情我们需要留意的是,几乎所有的云防火墙的规则都会对搜索引擎机器人设置白名单。 目前...
  • 需要注意的是,在执行SELECT查询语句时,SQL是不会将字符串缩短为25个字符的。因此,这里将使用完整的字符串进行搜索,所以不会找到匹配的结果。接下来,当执行INSERT查询语句时,它只会插入前25个字符。 mysql...
  • HTML5安全风险详析之三:WebSQL攻击

    万次阅读 2012-10-08 17:49:04
    一、WebSQL安全风险简介 数据库安全一直是...WebSQL的安全问题通常表现为两个部分: 第一种是SQL注入:和本地数据库一样,攻击者可以通过SQL注入点来进行数据库攻击。 另外一方面,如果Web App有XSS漏洞,那么本地数
  • PreparedStatement preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1,username); preparedStatement.setString(2,password); ResultSet resultSet=preparedStatement....
  • require_once('sqlin.php');
  • 3.利用SQL注入漏洞入侵网站实例演示(上)  http://tech.163.com/07/0821/16/3MEDF73100092AR5.html   4.利用SQL注入漏洞入侵网站实例演示(下)  http://tech.163.com/07/0821/16/3MEDFQKR00092AR5.html   5.经典...
  • 简单的ASP页面防SQL攻击程序

    千次阅读 2005-04-19 14:34:00
    检查非法输入CheckRequestItems()检查非法SQL注入Function CheckRequestItems() For Each Elements In Request.QueryString If Instr(1, Request.QueryString(Elements), ";", 1) > 0 And Instr(1, Request....
  • ASP使用者不使用request,用SafeRequest("","","")函数来代替本SQL防止了Cookies的绕过攻击,具体解说看下面。配合自己编写一个数据库来记录与判断黑名单功能即可希望有人与我交流~~dim full,checkipcheckip=userIP...
  • SQL注入攻击

    千次阅读 热门讨论 2013-12-15 20:46:15
    SQL攻击(SQLinjection,中国大陆称作SQL注入攻击,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,422
精华内容 6,168
关键字:

sql攻击