微信公众号:白昼信安
如果你觉得文章对你有帮助,欢迎点赞[🍉
1.SQL简介及危害
SQL注入:就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。
SQL产生原因:1.对用户输入没有严格过滤;2.使用了字符串拼接的方式构造SQL语句。
SQL注入危害:轻则泄露数据库信息,网站数据被篡改、删除,重则导致服务器被拿下,威胁内网安全。
2.如何判断数据库类型
在测试过程中,我们首先需要知道对方使用的什么类型的数据库及其版本,对症下药才能药到病除。
常用的判断方法:
1.常见的前端代码与数据库的固定搭配;
asp:SQL Server,Access
asp.net:SQL Server
php:MySQL,PostgreSQL
java:Oracle,MySQL
2.端口判断
Oracle:默认端口1521
SQL Server:默认端口1433
MySQL:默认端口3306
DB2:默认端口号为:5000;
PostgreSQL:默认端口号为:5432
等等
3.根据特有函数来判断
len():SQL Server 、MySQL以及db2返回长度的函数。
length():Oracle和INFORMIX返回长度的函数。
version():MySQL查询版本信息的函数
@@version:MySQL和SQL Server查询版本信息的函数
MySQL:substring和substr都可调用
Oracle: 只可调用substr
SQL Server: 只可调用substring
4.根据表名判断
1.MySQL(version>5.0)
http://127.0.0.1/test.php?id=1 and (select count() from information_schema.TABLES)>0 and 1=1
2.Oracle
http://127.0.0.1/test.php?id=1 and (select count() from sys.user_tables)>0 and 1=1
3.SQL Server
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
等等
5.Sqlmap等工具识别
sqlmap -u "http:\127.0.0.1"
3.SQL注入分类(细分) 【2,3,4中篇再写】
1.从注入手法上分类:联合、报错、布尔、延时、堆叠、宽字节、DNSlog
2.根据注入点类型分类:数字型、字符型、搜索型
3.提交方式分类:GET,POST,Cookie,HTTP头(XFF注入、UA注入、REFERER注入)
4.根据查询方式分类:select、insert、delect、update、order by等
4.SQL注入各类型简析
4.1 联合查询(union注入)
联合查询适用于有回显的注入,我们可以将id=1写为id=-1'(前面错误即可),然后我们再后面加上union语句即可。
案例演示:sqllab靶场第一关
之后就可以直接按正常注入语句开始即可
// 获得所有的数据库(mysql5.0以上版本默认information_schema库,存放着关于MySQL服务器所维护的所有其他数据库的信息)
http://127.0.0.1:8989/sqli-labs-master/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
// 获得所有的表
http://127.0.0.1:8989/sqli-labs-master/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables--+
// 获得所有的列
http://127.0.0.1:8989/sqli-labs-master/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns --+
等等操作
4.2 报错查询
报错查询属于盲注类型,因为它主要用于无法回显的页面,利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
利用前提:页面上没有显示位。
缺点:但是需要输出 SQL 语句执行错误信息。
常用的报错回显函数:floor,updatexml(常用),extractvalue等
案例演示:pikachu靶场insert/updata关卡
1.使用floor函数报错(主要检测时和插入时两次计算的所以输不一致就会报错)
2.updatexml:如果XPath_string的值不符合xpath的语法格式则会报错。
3.extractvalue:如果Xpath格式语法书写错误的话,就会报错。
当然,除此之外,还有很多报错函数,可以看下面这篇文章:
mysql 二十余种报错注入姿势(推荐):
https://www.cnblogs.com/feizianquan/p/10794681.html
报错注入原理探究(有兴趣可以看一下):
http://blog.csdn.net/he_and/article/details/80455884
4.3 延时判断
sleep和if函数
sleep函数:通过在语句中添加一个sleep(n)函数,强制让语句停留n秒钟
if函数:if[格式:if(condition,A,B)],当condition为真,返回A,为假,返回B,相当于if….else….语句,常于sleep联合使用
案例演示:sqllab靶场
之后操作逐个拆解即可
4.4 bool盲注
延时注入会用到布尔盲注的所有函数,包括:length()、substr()、ascii()函数
页面只返回True和False两种类型页面,利用页面返回不同,逐个猜解数据。
函数推荐优先使用ascill码
理由:1,引号会转义 2.使用for循环更快,简单 3.使用二分法可以很快排除
案例演示:sqllab靶场
之后操作和其他一致
4.5 堆叠注入
在SQL中,分号(;)是用来表示一条SQL语句结束的。试想一下我们在分号结束一个SQL语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而堆叠注入可以执行的是任意语句(增删改查)。
案例演示:sqllab靶场38关
在id=1后面插入sql语句
http://127.0.0.1:8989/sqli-labs-master/sqli-labs-master/Less-5/index.php?id=1’;insert into users(id,username,password) values(‘10000’,‘abcd’,‘abcd’) --+
然后我们再去查看数据库,成功被插入了一条数据。
虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,
前提条件:1、已知的支持堆叠注入漏洞,2、已经通过其他方式获取了数据库表的相关信息
真实案例:两道CTF题中的堆叠注入
https://www.cnblogs.com/Tkitn/p/11964240.html
4.6 宽字节注入
原理:宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围。
宽字节利用条件:
1.数据库查询设置为GBK编码;
2.使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()这类的过滤函数。
案例演示:sqllab靶场32关
输入?id=1%df%27,页面会报错说明单引符号起作用了。
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出echo strlen("中");页面编码为gbk时输入2,utf-8时输入3;mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%df%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候,往往利用的思路是将 ' 转换为 \' 。所以如果我们输入%df%27(%27就是单引符号会被转义成\' 也就是%5c%27),在后台%df会将%5c“吃掉”,组成一个汉字(%df%5c是一个汉字)。
4.7 DNSlog盲注回显
这个比较特殊要用到一个平台,后面到时候具体出一片文章具体分析一下。