SQL 注入是WEB安全领域中的一种常见的攻击方式。
注:其实xss[跨站脚本攻击]也是对HTML的一种注入哦
什么是注入,这要先了解到SQL注入的发家史,SQL注入第一次出现是在1998年的黑客杂志《Phrack》第54期,一名叫做rfp的黑客发表的一篇文章中,之后注入攻击被大众所知。
自2005年后随之WEB安全的不断提高,SQL注入漏洞也急剧减少,同时变得更加难以检测与利用,但是这阻挡不知去细心的发现它
SQL注入是怎么产生的
WEB开发人员无法保证去过滤所以提交的数据
数据库未做相应的安全配置
攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)
环境搭建概括[注意概括两个字哦,我要整你们一下]
这里推荐这个环境软件,很不错,比其他的软件更容易上手,软件连接后台回复124获取
在下载公众号工具库里的环境分享里的DVWA
或者可以进入github下载: https:///ethicalhack3r/DVWA
下载后是这个样子滴
这个样子滴然后点击config文件夹
敲黑板:在GitHub下要进入config进行数据库设置,还有文件名尽量与教程一样,截图中config文件里有两个文件,是在对比,修改留有php后缀名的即可。
打开之后就可以自行修改数据库用户名与数据库密码了哦[注;因为启动环境的不同,非教程启动环境的同学可以修改,如果按照教程一步步来的话请勿修改]
本教程数据库账号密码如下
账户:root
密码168168
打开网站是这个样子滴[注在启动默认环境里要注意自己的8080端口是否被占用哦]
点击重置数据库
注;这不是乱码这不是乱码,是游览器的翻译插件,未来更加直白地讲解所以我使用英文版
输入账号密码就进入咱的环境了
点击创建数据库会跳转到DVWA的登录界面,DVWA的默认用户名是"admin",密码“password”登录。[敲黑板,不要用数据库账号密码登陆哦]
注;如果Web返回消息会出现乱码,进入\DVWA-1.9\dvwa\includes 打开DVWA目录includes文件夹中dvwaPage.inc.php,将dvwaPage.inc.php中charset=utf-8全部更改为charset=gb2312然后保存。
打开之后是这个样子的
看不懂没关系先放一张汉化后的帮助理解
还有的汉化错的,真是汗颜
设置难易度
依次点击,测试之前先查看源代码
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
发现这条查询语句$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
综合整体代码发现并没有对其实现过滤的一个机制,那就好办了
回到之前的页面输入1,发现查询成功
输入1 and 1=1也查询成功
这样输也成功,为什么?
看一下查询语句
SELECT first_name, last_name FROM users WHERE user_id = '$id';";
我们输入语句后会成
SELECT first_name, last_name FROM users WHERE user_id = '1' and '1' = '';";
找到不同之处了吗这就是典型的字符型注入
在这里不去太过详细的去讲这个玩DVWA网上的教程很多,这里只把安装的坑点列出来,在这里着重讲原理多一些[不知道整到没有(小声逼逼)]
同学们闲暇时间可以对照网上的教程去游戏
可能现在有人说了,哇,一步步按教程来的,怎么说不玩就不玩了呢,不讲怎么玩DVWA那讲什么,其实,我也是有想法的,搭建一下实验环境,
乐呵乐呵,但是大佬们看得懂,小白们还是一知半解啊,我们则终于对小白的......
情不自禁又打一波广告,快点讲吧,要不有人说我废话多了。
注入攻击的分类分为两种[这里引用了张炳帅的WEB深度剖析一书,我的WEB启蒙书推荐给你们,别抬杠啊,告诉你们]
数字型注入
字符型注入
首先数字型注入形如这样的www.sssss.com/tist.php?id=12
就可以猜测是否有数字型注入
测试流程
在域名后添加 '
英文状态下的单引号这时假设SQL语句如下
select * from admin id=12'
他肯定会因为SQL语句的不正确而报错
这证明了他把咱提交的单引号代入数据库去查询了,那么就好办了,现在一些网站的SQL防御机制大多数对单引号进行过滤从而去防御SQL注入的攻击
那咱常见的and 1=1 与and 1=2 是干什么的啊
这个要看两个语句
select * from admin id=12 and 1=1
select * from admin id=12 and 1=2
这两条语句有什么区别呢,其实最重要的就是真假的问题
and 1=1为真 添加域名后请求与不添加请求无差异
and 1=2 为假添加域名后请求与不添加请求有差异
那有人就开始问了什么语言,出现的最多呢,答案是ASP与PHP等弱类语言编写的程序中常常出现,弱类型语言会自动识别ID后面的数据类型如12为int型,12 and 1 = 1 属于string型
小提示[int型为整型,string型为字符串]
字符型注入
引用上方的语句做案例
"SELECT first_name, last_name FROM users WHERE user_id = '$id';";
看起来好复杂啊,没有事情,咱把它简化一下
SELECT first_name, last_name FROM users WHERE user_id = '$id';
这样还看不懂怎么办,没事我还能变[泪目]
如下我提交了admin
select name from users where id = 'admin'
上述环境中我们使用了
提交了1' and '1' = ''为值,这种提交方式只是 让双引号去闭合,避免他报错如下
select name from users where id = 'admin 'and '1’='1'
有小伙伴问为什么1被单引号圈起来而and不用呢,这里要说了and你可以先当做是个连接符 上述字符与数字一起提交会报错,用单引号引起来那么环境语言会识别为string型,这样不会报错哦
当然你也可以这样
select name from users where id = 'admin and1=1'
也可以这样
select name from users where id = 'admin 'and 1=1 --'
去注释这个单引号
这些的效果都是一样的
当然最简单的
直接丢进sqlmap去扫扫看呗
这样,虽然很简单但是很骚厉害,嘿嘿嘿。突然有一句话传来,啥是sqlmap
。。。。。。。。。
短暂沉默,我给你打包,首先要布置Python环境注意版本为2.7,别下3.的那个版本不对会报错的
然后设置环境变量如图