本文持续更新。为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