SQL注入与防御研究(一)

本文持续更新。为SQL注入攻击与防御第二版读后感

第一章

SQL注入产生过程:

1.字符处理不当

       '作为分界线。

2.类型处理不当

       数字型,没加单引号,直接可继续执行命令。 LOAD_FILE, SELECT INTO OUTFILE

3.查询语句组装不当

       $SQL = "SELECT". $_GET["column1"]. ",". $_GET["column2"]. ",".$_GET["column3"]. "FROM". $_GET["table"];

       可直接使用user,password替换,得到数据

4.错误处理不当

       SQLserver打印错误日志时对语句进行拼接处理,导致SQL恶意代码的继续执行

5.多个提交处理不当

       这个也算是逻辑漏洞,step1检查了的数据,step2不检查,如果存在越权等可造成SQL注入。

数据库配置的不安全之处,主要是权限控制的问题,应该遵守最低权限的原则。

mysql快速查表,可以利用INFORMATION_SCHEMA

SQLserver可以利用INFORMATION_SCHEMA,sysobjects 、 sysindexkeys 、 sysindexes 、 syscolumns 、systypes进行快速查表,SQLserver2005后引入了名为sys.*的目录视图,并限制用户只能访问拥有相应访问权限的对象。所有的 SQL Server 用户均有权访问数据库中的表并可以查看表中的所有行,而不管用户是否对表或所查阅的数据拥有相应的访问权限。

Oracle则提供了ALL_TABLES 、 ALL_TAB_COLUMNS等进行全局查看。以 DBA_ 开头的视图显示数据库中的所有对象,但是要有DBA权限才行。

example:

--Oracle 语句,列举当前用户可访问的所有表
SELECT OWNER, TABLE_NAME FROM ALL_TABLES ORDER BY TABLE_NAME;
--MySQL 语句,列举当前用户可访问的所有表和数据库
SELECT table_schema, table_name FROM information_schema.tables;
--MSSQL 语句,使用系统表列举所有可访问的表
SELECT name FROM sysobjects WHERE xtype = 'U';
-- MSSQL 语句,使用目录视图列举所有可访问的表
SELECT name FROM sys.tables;

第二章

mysql,Oracle,sqlserver均可使用同 -- 进行单行过滤,/**/用于多行过滤

mysql #用于单行过滤

如何通过连接运算符识别不同数据库?

sqlserver    'a'+'b'='ab'

mysql 'a' 'b'='ab'

oracle 和 postgresql 则是 'a' || 'b'='ab'

第三章只是简单涉及到SQL注入的代码审计,并为深入讲解,此处略过。

第四章

ASP.NET和PHP使用mssql的时候允许堆叠查询,java使用mssql不允许堆叠查询,PHP使用mysql不允许堆叠查询,postgresql则允许。

例如查询name=acme的值的时候,可以将m替换为ascii码,这意味着我们存在了可控数字参数,可以使用char(108+(case when + (system_user='sa') then 1 else 0 end)+'e'),这意味着,如果是sa权限的话,108+1=109,如果不是则是108,由此可以对内容进行猜测。

权限提升

SQLserver

openrowset(通过爆破口令提升权限):

                      1.必须有执行连接的连接凭证,最低权限也可;

                      2.openrowset在远程或本地调用中均可使用;

                      3.sqlserver2000所有用户均可调用,2005和2008在默认情况是被禁用的。

                      可以参考:https://blog.csdn.net/daxueba/article/details/70853846

                      可以用如下语句检查当前SqlServer使用的验证方式(windows或者是混合型验证,只有混合型验证时sa才会启用)

                      select serverproperty('IsIntegratedSecurityOnly')

                      当验证方式是windows时,则会返回1,其他返回0

                      Kali提供的SQL Server数据库注入工具sqlninja可以进行openrowset爆破。

                      可以用该语句查询openrowset是否开启。

                      select value_in_use from sys.configurations where name LIKE 'Ad Hoc%'

Oracle

                      除去我在其它博文提到的oracle提权方式外,仍存在工具可以提权,可参考如下链接:

                      https://www.cnblogs.com/rebeyond/p/7928887.html

                      另外使用utl_inaddr.get_host_name是一种有效地报错注入方法

                      另外还有GET_DOMAIN_INDEX_TABLES函数注入漏洞可以成功提权,详情可参考:

                      https://www.iswin.org/2015/06/13/hack-oracle/

Mysql

                      这个网上的参考材料就比较多了,kali也有现成的攻击载荷。可以参考如下文章:

                      https://blog.csdn.net/he_and/article/details/81434865

密码获取

Sqlserver

                      sqlserver2000中,密码存储在master库sysxlogins表中,可以直接使用如下语句:

                      select name,password from master.do.sysxlogins;

Mysql

                      select user,password from mysql.user;

Postgresql

                      select usename,passwd from pg_shadow;

                      select rolname,rolpassword from pa_authid;

Oracle

                      select username,password from sys.user$ where type#>0 and length(password)=16

                      oracle DES口令破解最快的工具是 woraauthbf;SHA1最快的是GSAuditor

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值