一、前言
大家好 我是Monkey。今天给大家带来的是普通的SQL注入 第一次发帖 好紧张 进入介绍吧!
二、介绍:SQL注入是什么?
SQL 注入指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操作,其主要原因是程序 没有细致地过滤用户输入的数据,致使非法数据侵入系统。
三、SQL注入的类型
在介绍中我们知道了什么是SQL注入 SQL注入也有类型 一种是intger(整数)和string(字符型)注入 这两个都有他们的不同性质 好 进入正文给大家介绍一下什么是"intger(整数)和string(字符型)注入"
四、正文:intger注入是什么?
在PHP中intger就是整数 也就是数字型的类型。进入代码 给大家详细介绍:
<?php
$conn=mysql_connect('localhost','root','root');
mysql_select_db("admin");
mysql_query("set names utf-8");
echo $id=$_GET['id'];
echo "<hr />";
$sql="SELECT * FROM news where id=$id";
if($row=mysql_query($sql)){
$rows=mysql_fetch_array($row);
var_dump($rows);
}
?>
给那些没PHP基础的介绍一下这些个函数还有建立数据库 有的可以绕过 看下面:
1、mysql_connect('localhost','root','root'); 就是一个用来连接mysql的函数 里面的第一个参数就是host 你本地的host 就是你访问php的页面,也可以为127.0.0.1 也是本地的host,后面的第一个root是你phpmyadmin数据库的账号,再后面那个root 就是password 密码 你数据库的密码,默认是root ,账号默认也是root。
2、mysql_select_db("admin"); 选库 不会建立数据库的在下面 给大家介绍怎么建库
3、mysql_query("set names utf-8"); 这个函数的意思就是 执行sql语句 参数的里面的就是把mysql字符集设置为utf-8
4、echo $id=$_GET['id']; 这里的意思就是 接收以get方式传过来的参数 就好像host/a.php?id=xxx
5、echo "<hr />"; 这个的意思 就是在页面上 输出一条线 好区分
6、$sql="SELECT * FROM news where id=$id"; 把sql语句赋值给$sql这个变量 SELECT * FROM news where id=$id SELECT就是sql语句中的查看语句 中间的news就是表id=$id 就是如果id传过来的参数 比如 id=1 就是查看数据库中id为1的信息
7、if($row=mysql_query($sql)){
$rows=mysql_fetch_array($row);
var_dump($rows);
} 这一块 他用var_dump直接打印出sql语句了 可以直接执行sql语句
如果有不懂的可以问我qq:737638156(Monkey)
OK 介绍了一些个函数了 然后再给那些不懂PHP一点基础的人 介绍一下建库
五、建立MYSQL数据库
默认的登陆页面:localhost/phpmyadmin/
OK 就是这个页面 默认登陆账号 root 密码root
好了 登陆进来的页面:
有库就去左边 没库的就去点打红色圈圈的数据库那个地方
来到这里后 创造数据库名为admin可以自己定义的 什么的行 然后旁边的utf8_general_ci就是字符集
创建成功 就点左边的admin这个数据库
进来了 他说这个数据库中没有表 咱们就创个表 随便来个news吧 字段数为3吧
字段数也可以自己随便定义。如果没定义好 可以在后面添加 点执行
表名字自己也可以随便定义
表类型嘛INT就是数字型 VARCHAR就是字符型
表长度也一样 自己定义 多长 然后如果你觉得你少加了一个的话 可以在这里添加
这里执行 1个就添加一个 2个就添加二个。。。。
然后还有下面的
这里的表注释可以填 也可以不填
然后就是MYSQL库的存储引擎 长话短说介绍
1、MyISAM存储引擎:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种
2、MyISAM Merge引擎: 这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。
3、InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能
就先介绍这几种 如果想了解详情: http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html
OK 点保存
保存之后再访问这个admin这个数据库
里面有个名叫news的表 就是咱们刚刚创建的那个表 点news 进去看看
里面没有数据 现在咱们就要插入数据
点击插入
这里的值为1 可以自己定义 当localhost/test.php?id=1 id为1时 里面的uname和pword里面的值就会输出
这两个表里的数据
uname和pword里面的就随便定义吧 反正只是测试
然后下面那个
内容不一样就行 不然你和上面的id一样为1 拿就会输出两个字段的值。。。
注意! 跟着红色的箭头 黑色的那个就插入一个字段 点执行插入这些字段
无视这里:
直接去浏览
好了 建立数据库说完了 该说漏洞利用了
五、intger注入的漏洞利用
ok 说了这么多 就该来说漏洞利用了吧 咱们首先来到localhost/test.php?id=1
刚刚 咱们插入的id和uname和pword的两个字段输出了
也就是代码的这一块 直接用var_dumpb把sql语句打印出来
咱们再来看代码:
可以看到代码中$id变量中没有进行任何转义函数 可以直接利用的
咱们localhost/test.php?id=1 and 1=1试试
正常 再试试and 1=2
出现bool(false) 那就是平常咱们检测一样 and 1=2 就会显示错误 那还用说 那就是存在 怎么用sqlmap神器试试
访问http://localhost/test.php?id=-1 union select 1,user() from test
如果没有用单引号保护 $id的话 可以随便注入 这里代码中的【$sql="SELECT * FROM news where id=$id";】 id=$id 并没有用单引号 可以随便注入 OK 说完int注入就是string注入了
六、string注入的漏洞利用(加单引号就是string 没加就是intger 容易理解)
测试代码:
<?php
$conn=mysql_connect('localhost','root','root');
mysql_select_db("admin");
mysql_query("set names utf-8");
echo $id=$_GET['id'];
addslashes($id); //这里用了转义函数
echo "<hr />";
$sql="SELECT * FROM news where id='$id'"; //这里加了单引号
if($row=mysql_query($sql)){
$rows=mysql_fetch_array($row);
var_dump($rows);
}
?>
ok 代码中【addslashes($id)】 这里用了addslashes()函数转义了$id addslashes()函数转义这些:
单引号(')
双引号(")
反斜杠(\)
NULL
这样 我们就无法注入了 怎么办呢?详情看下面
咱用上节课学的知识 ?id=-1 union select 1,user() from news试试
出现了这个 就是查询失败了 咱们打印输出一下sql语句
咱们测试一下 访问 localhost/test.php?id=1 看看他的sql语句
OK 成功执行了 但是他现在的sql语句是: SELECT * FROM news where id='1' 细心的人可以看见 他sql语句后面的’1’有两个单引号闭合 他才可以成功执行 然后 我们试试不加单引号 执行的sql语句是什么?
好了 我把代码中的单引号去了 为了更好观察 咱们把转义函数 用// 两个下划线注释掉
再来访问 localhost/test.php?id=1 看看他执行的sql语句
直接执行SQL语句SELECT * FROM test where id=1 好 咱们再去加单引号 并且开启转义函数
咱们现在访问localhost/test.php?id=-1 union select 1,user() from news试试
可以看现在执行的sql语句为SELECT * FROM news where id='-1 union select 1,user() from news' 可以看到怎么前面查询1的时候SQL语句是这样的SELECT * FROM test where id='1' 用了两个单引号把1给闭合了 那咱们闭合了-1就可以成功执行了吗?要怎么闭合呢??现在可以看见SQL语句是这样的
前面咱们说了 只要把-1 这里用两个单引号闭合就行了 那我们到url输入 localhost/test.php?id=1’ union select 1,user() from news 试试sql语句是什么?
好了 现在的sql语句是这样的 为什么还是没成功执行sql语句呢?咱们在是闭合了前面的-1 但是代码中的id那个单引号还没把他给注释掉 咱们看代码:
把代码中$sql="SELECT * FROM test where id='$id'"; ‘$id’” 咱们去掉一个单引号试试
OK 注入成功! 但是在实战中可以这样吗?当然不行 咱们加上单引号 这样测试只是让我们更加理解
加上 再执行url:localhost/test.php?id=-1’ union select 1,user() from news 咱们再这加上%23(url编码 意思就是一个#) 把咱们后面单引号给注释掉 就像我们把他删除一样试试
OK注入成功
束语: 这个文章字比较多 图片也比较多 如果发现错别字或者有什么地方不懂的请在下面留言提醒我 也希望大家多多支持i春秋社区 谢谢!!! 这是第8遍 修改此文章 测试代码是在下百度查来的 经验纯属本人!!!