代码审计&细谈SQL注入【修改八遍,只为真正让你学会】

一、前言
大家好 我是Monkey。今天给大家带来的是普通的SQL注入 第一次发帖 好紧张 进入介绍吧!
103731dmmf0fhlfiof4555.png


二、介绍: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一点基础的人 介绍一下建库 103731obncaxzyr6mq3drd.png

五、建立MYSQL数据库
默认的登陆页面:localhost/phpmyadmin/
103731ykbk1cizi2s1cclg.png
OK 就是这个页面 默认登陆账号 root  密码root
好了 登陆进来的页面:
103732rq1za3lofofu663f.png
有库就去左边 没库的就去点打红色圈圈的数据库那个地方
103733l14b5kbbhoavrtae.png
103752zae3a4344n4y4sae.png 来到这里后 创造数据库名为admin可以自己定义的 什么的行 然后旁边的utf8_general_ci就是字符集

创建成功 就点左边的admin这个数据库
103734lnemeg6t3ggdtml7.png
103734eboa0xcakboogajz.png
进来了 他说这个数据库中没有表 咱们就创个表 随便来个news吧  字段数为3吧
103735ufifedd44tfdmdqi.png
  字段数也可以自己随便定义。如果没定义好 可以在后面添加 点执行
103735t76mb29lbn2km5g5.png
表名字自己也可以随便定义
103735icra1iax1aqrceh1.png
表类型嘛INT就是数字型 VARCHAR就是字符型
103735dppp78e88fzfy08m.png
表长度也一样 自己定义 多长  然后如果你觉得你少加了一个的话 可以在这里添加
103736n94u4926urs428v3.png
这里执行 1个就添加一个 2个就添加二个。。。。

然后还有下面的
103736tfvx0pnvp95xhhxx.png

这里的表注释可以填 也可以不填

然后就是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  点保存
103737wqvg7iai7ifeis37.png

保存之后再访问这个admin这个数据库
103737ymz09prp9m0yyt0r.png
里面有个名叫news的表 就是咱们刚刚创建的那个表 点news 进去看看
103738eo7uber1t7ivaimo.png
里面没有数据 现在咱们就要插入数据  
103738ll0whzyl866t7mz8.png

点击插入
103739gkehzzhcgepfom0p.png
这里的值为1 可以自己定义 当localhost/test.php?id=1 id为1时  里面的uname和pword里面的值就会输出

这两个表里的数据
103740fb5q5vp8j1bz6bvm.png
uname和pword里面的就随便定义吧  反正只是测试

然后下面那个
103740cii8gehil1jeem8i.png
内容不一样就行 不然你和上面的id一样为1 拿就会输出两个字段的值。。。
103742ubq1cbz1g1gmbgj1.png
注意! 跟着红色的箭头 黑色的那个就插入一个字段 点执行插入这些字段
无视这里:
103742elqgqx7q4jqq2qg8.png
直接去浏览

好了 建立数据库说完了 该说漏洞利用了


五、intger注入的漏洞利用
ok 说了这么多 就该来说漏洞利用了吧  咱们首先来到localhost/test.php?id=1
103742q4td7tyytaoay74o.png
103742tyd7888x85xgdyp5.png 刚刚 咱们插入的id和uname和pword的两个字段输出了
103743ed4zypia8g4ddd6b.png
也就是代码的这一块 直接用var_dumpb把sql语句打印出来

咱们再来看代码:
103744vj3lpnpn46opp6h6.png
可以看到代码中$id变量中没有进行任何转义函数 可以直接利用的
咱们localhost/test.php?id=1 and 1=1试试
103744ohojo6mqmmyt6j1l.png
正常 再试试and 1=2
103745h977984vj4cpz447.png
103745gmkhzdiuozukkzue.png 出现bool(false)  那就是平常咱们检测一样 and 1=2 就会显示错误 那还用说 那就是存在 怎么用sqlmap神器试试 103745phgtl4pnwsthn8dg.png

103745isrs4jr6ogx74trv.png
访问http://localhost/test.php?id=-1 union select 1,user() from test
103746zf7nynqmxnpcti7f.png
如果没有用单引号保护 $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试试
103747qpszpj0m6qjxzksm.png
出现了这个 就是查询失败了  咱们打印输出一下sql语句
103748glm54f4mi45rmfm8.png
咱们测试一下 访问 localhost/test.php?id=1 看看他的sql语句
103748n6zsxypff7yt6256.png
OK 成功执行了 但是他现在的sql语句是: SELECT * FROM news where id='1'  细心的人可以看见 他sql语句后面的’1’有两个单引号闭合 他才可以成功执行  然后 我们试试不加单引号 执行的sql语句是什么?
103749y3yfz31jt7ou3dl1.png
好了 我把代码中的单引号去了 为了更好观察 咱们把转义函数 用// 两个下划线注释掉
103749jmhfm8at9s053428.png
再来访问 localhost/test.php?id=1 看看他执行的sql语句
103749jppgvgmaozlvzhnl.png
直接执行SQL语句SELECT * FROM test where id=1  好 咱们再去加单引号 并且开启转义函数
103750xaf8lbbkabjhoafb.png
咱们现在访问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语句是这样的
103750hirkgdkk6ki46mn7.png
前面咱们说了 只要把-1 这里用两个单引号闭合就行了 那我们到url输入 localhost/test.php?id=1’ union select 1,user() from news 试试sql语句是什么?
103750kya2t34o3hazhuuz.png
好了 现在的sql语句是这样的  为什么还是没成功执行sql语句呢?咱们在是闭合了前面的-1 但是代码中的id那个单引号还没把他给注释掉  咱们看代码:
103750rrrbwkbv22rbwwa4.png
把代码中$sql="SELECT * FROM test where id='$id'";  ‘$id’” 咱们去掉一个单引号试试
103751kqnykkhaa4mnnjz9.png
103751c30pc0624l3kl3tb.png
OK 注入成功! 但是在实战中可以这样吗?当然不行 咱们加上单引号 这样测试只是让我们更加理解
103751e25o1ftkkkf002k7.png
加上 再执行url:localhost/test.php?id=-1’ union select 1,user() from news  咱们再这加上%23(url编码 意思就是一个#) 把咱们后面单引号给注释掉 就像我们把他删除一样试试
103751ow2o4x84ccn221jm.png

OK注入成功

110615ulhhxhljhllarjth.jpg 束语: 这个文章字比较多 图片也比较多 如果发现错别字或者有什么地方不懂的请在下面留言提醒我  也希望大家多多支持i春秋社区 谢谢!!!  这是第8遍 修改此文章 测试代码是在下百度查来的 经验纯属本人!!!

转载于:https://my.oschina.net/ichunqiu/blog/838213

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值