一、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报错
5、判断显示位:显示位是1和2,可以用MySQL语句来代替获取信息!
6、获取数据库名称和版本信息
version():获取数据库版本号
database():获取数据库名称
7、获取数据库中表的名字
获取第二个表名
8、获取所有的表名
limit 0,1:第一个表名,guestbook
limit 1,1:第二个表名,users
......
limit n,1:第n个表名,......
group_concat():连接所有表名
9、获取user表中的字段名
10、获取字段的内容
二、布尔注入
1、判断是否存在注入,输入’,报错说明存在注入
报错,说明存在注入
2、判断字符注入还是数字注入
都没有报错,说明是字符型
3、判断是否是存在布尔注入
报错,说明存在布尔注入
4、id=1能正常显示信息,加入and语句后,只有同时满足条件才能正常显示,根据这个逻辑去确定最终的数据库长度
5、判断数据库名的长度
length():计算字符串长度
返回正常,说明该数据库名的长度为8
6、获取数据库名的每个字母
substr(database(),1,1):字符串的第1个字符,第一个1,起始位置,不是0开始,而是1开始;最后一个1,取字符的个数,1代表取1个字符
substr(database(),2,1):字符串的第2个字符
ascii():字符转换为对应的ASCII码值
ord() == ascii()
left:从左边开始取字符
115代表字符s
101代表字符e
最后确定数据的名字为security
7、获取表的名字
获取第一个表的第一个字符e
获取第一个表的第二个字符m
获取第二个表的第一个字符r
获取第二个表的第二个字符e
8、获取user表的字段
是否存在use开头的列
是否存在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值。
获取username字段的第一个数据的第一个字符
获取username字段的第一个数据的第一个字符
获取username字段的第二个数据的第一个字符
获取username字段的第二个数据的第二个字符
Angelina