前三篇文章都是在讲发现SQL注入漏洞

如何查询得到所有的信息

那么另一条思路还未尝试过:能否修改数据?

例如这样:

'; update users set user='yiqing' where user='admin

理论上是会成功的,由于DVWA编写BUG,导致无法执行

实战中,可以这样直接修改数据

可以修改,那么就可以插入数据:

'; INSERT INTO users (' user_id',' first_name',' last_name',' user','password','avatar') VALUES ('35','yiqing','xu','xyq','5f4dcc3b5aa765d61d8327deb882cf99','OK'); --

更恶意的人可以删库:

'; DROP TABLE users; --

由于DVWA的编写问题,这些示例都不能成功

可以这样说:正式由于程序员水平不够,阴差阳错防止了一部分SQL注入

到这里其实基本的手工SQL注入就说完了

实战中,SQL注入考验的是一个人的综合素质

以及对数据库本身的了解程度

一个人如果是SQL注入方面的大师,那么他一定是数据库方面的专家

接下来对DVWA三种SQL注入的源码进行分析:

低级别:

<?php    

if(isset($_GET['Submit'])){

    // Retrieve data

    $id = $_GET['id'];

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
?>

分析:

没有对输入做任何过滤,直接放入SQL语句

最后对结果进行输出

缺陷:

1.对输入没有任何过滤

2.如果查询失败,直接返回数据库错误信息,不妥

中级别:

<?php

if (isset($_GET['Submit'])) {

    // Retrieve data

    $id = $_GET['id'];
$id = mysql_real_escape_string($id); $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i=0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
?>

分析:使用函数:

mysql_real_escape_string()

对输入进行过滤

这个函数的作用:给非法字符'"/%#等字符前面加上转义符号:\

还有一个地方存在问题:SQL语句没有使用拼接的方式,所以SQL注入不需要单引号进行闭合

新版本的PHP语言采用其他函数:MySQLi,PDO_MYSQL

结论:

1.SQL注入漏洞还是存在,而且会报错,理论上可以避免一部分SQL注入

2.无意义代码:既然过滤了单双引号,那么为什么要改SQL语句,使得不需要引号就可以注入

3.依然可以SQL注入,有方法绕过输入过滤

注入方式:

其实注入比刚才反而简单了:比如查所有的表

0 union select table_name,table_schema from information_schema.tables

高级别:

<?php    

if (isset($_GET['Submit'])) {

    // Retrieve data

    $id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id); if (is_numeric($id)){ $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i=0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
}
?>

分析:

首先函数

stripslashes()

去掉字符\

然后再进行中级别的特殊字符转义

这些都是小问题,之所以高级别,在于下面这个函数:

is_numeric()

如果输入不是一个数字,那么什么都不执行

结论:很安全,几乎不可能找到SQL注入漏洞

到这里SQL手工注入就完成了

后边将说一说SQL盲注和SQL自动注入,以及神器SQLMAP

Kali学习笔记42:SQL手工注入(4)的更多相关文章

  1. 小白日记41:kali渗透测试之Web渗透-SQL手工注入(三)-猜测列名、表名、库名、字段内容,数据库写入

    SQL手工注入 靶机:metasploitable(低)  1.当无权读取infomation_schema库[MySQL最重要的源数据库,必须有root权限]/拒绝union.order by语句 ...

  2. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

  3. 小白日记40:kali渗透测试之Web渗透-SQL手工注入(二)-读取文件、写入文件、反弹shell

    SQL手工注入 1.读取文件[load_file函数] ' union  SELECT null,load_file('/etc/passwd')--+ burpsuite 2.写入文件 ' unio ...

  4. 小白日记39:kali渗透测试之Web渗透-SQL手工注入(一)-检测方法

    SQL手工注入(一) SQL注入:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.[SQL注入原理] ##服务端程序将用户输入参数作为查询 ...

  5. SQL手工注入基础篇

    0.前言 本篇博文是对SQL手工注入进行基础知识的讲解,更多进阶知识请参考进阶篇(咕咕),文中有误之处,还请各位师傅指出来.学习本篇之前,请先确保以及掌握了以下知识: 基本的SQL语句 HTTP的GE ...

  6. 【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入

    很多新手小白入门后发现想要学好“网安”技术,除了掌握基础理论知识,更需要经常模拟不同的漏洞环境,但是如果使用外网服务器练习,会存在一定风险,因此能够搭建一个本地的模拟环境去测试漏洞将是一个不错的方案. ...

  7. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  8. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  9. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

随机推荐

  1. Springboot 打jar包分离lib,配置文件正确方式

    文章来源:https://my.oschina.net/xiaozhutefannao/blog/1932764 POM.xml <?xml version="1.0" en ...

  2. python 关于django 2.X from django.contrib.auth.views import login

    在学习注册用户的过程中,视图中下面的代码 from django.contrib.auth.views import login 启动django服务时,报错: ImportError: cannot ...

  3. 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践

    - 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践 - 实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...

  4. Python3.2.3官方文档(中文版)

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/66/ 来源:python黑洞网,专注 ...

  5. angular之表达式

    1.作用:使用表达式把数据绑定到HTML. 2.语法:表达式写在双打括号内:{{expression}} 3.比较:表达式作用类似于ng-bind指令:建议更多的使用指令. 4.AngularJS表达 ...

  6. CF719E. Sasha and Array [线段树维护矩阵]

    CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...

  7. 心得体会,搞清楚你为什么学习C++?

    小编作为一名初学者时,从来没问过自己学习C语言.C++等语言是为了什么? 一开始,接触到这个行业可以说是有种魔力引导我,感到了很大的兴趣,很有意思. 我试着读资料,报名学习,找资料,可算是功夫不负有心 ...

  8. IDEA+Tomcat+Maven+SpringMVC基于Java注解配置web工程

    1.在IDEA中新建Maven工程,使用archetype. 2.添加Maven依赖 <dependencies> <dependency> <groupId>ju ...

  9. vbs脚本实现qq定时发消息(初级)

    vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利 ...

  10. LDAP & Implementation

    LDAP & Implementation 一.什么是LDAP? (一)在介绍什么是LDAP之前,我们先来复习一个东西:“什么是目录服务?” 1. 目录服务是一个特殊的数据库,用来保存描述性的 ...