找回密码
 加入怎通
查看: 352|回复: 1

[站长八卦] 站在php细谈SQL注入攻击与XSS攻击

[复制链接]
寻路者 发表于 2013-01-07 16:50:14 | 显示全部楼层 |阅读模式
通常在编程中程序员要考虑的问题不仅是代码效率与代码复用性,而且还要考虑一些安全问题{. _5 p. D. j/ I
% P4 v' p/ X, n$ U# y. F3 ]' F& A
  例如: SQL注入攻击
) Q. j" F$ H2 M' |0 Z
( y( ?( w3 P; W* Z3 g! a  XSS攻击# ^0 Q/ I9 F  N. o2 n

- @1 ?  H- I8 B3 d8 @  任意执行代码: I* z2 @9 B; @* Q0 J+ {2 C
3 V7 Q! r% _8 O: K; ]4 S
  文件包含以及CSRF.
  z. F! d2 G( k+ d3 s
# L) H8 G: ]' z1 y8 M% ^% f  }
9 B! a% P' x- z" \0 A2 d8 u3 O- @0 C, Z; A3 F% {
  关于SQL攻击有很多文章还有各种防注入脚本,但是都不能解决SQL注入的根本问题$ B4 f+ O' ]2 r7 g1 W9 ~

; O8 [! b# E6 j- z; O  见代码:" y  Z- W  H( H; W( U3 j

3 F6 b/ v* g  E: [1 m. w     G3 p2 o' v) k; i' [4 l

/ g2 j5 i6 }1 R6 X7 [  mysql_connect("localhost","root","123456")or die("数据库连接失败!");) r; y7 D- \! v5 n
& L: ~$ [& C: I3 H- h/ P- R& `3 f
  mysql_select_db("test1");% i, x$ r4 g) B% D
' {3 u# m2 L+ h
  $user=$_post['uid'];) |2 U; I4 q- z9 _& V
, [5 x9 D7 {1 c3 g( D& [( H" D
  $pwd=$_POST['pass'];
. H$ b7 r& F# G4 o
" [4 f, u( L( F) Z  if(mysql_query("SELECT * from where6 [" x: q, u9 `6 [* F7 i+ E

* h5 L1 \/ \  B6 A: ?+ ^  admin+ B! O' ^2 K3 T7 j/ x: n7 s9 Y
( Y2 M! ?' j; `0 ^% X
  = `username`='$user' or `password`='$pwd'"){- N0 a* u, A+ ]! y( E
8 o& Z  g; t. ~1 B" `
  echo "用户成功登陆..";; ]# M$ \0 s8 K

, f4 K2 w. A* u, W3 W) n9 J3 g( a  } eles {
2 A7 Y4 k& m' B6 ?+ y
( F6 z8 j$ r0 x3 J! n5 M, U! I  echo "用户名或密码出错";0 |: D' j2 V# h. O; P
2 Q6 p, F& h: X9 M. y
  }
! X2 y2 k0 U2 u! c3 R! B5 l9 W
, V' |! m& c; Z- Q  Q  ?>
% w" ]: Y: h  w: T; w1 ?/ H, ~# `* @2 f
  很简单的一段代码,功能是用于检测用户名或密码是否正确,可是在一些恶意攻击者中提交一些敏感代码.后果可想而知.. post判断注入的方式有2种。
" `2 ?- c( F2 J2 ~$ }8 ^1 v' a, ]% C4 J* T5 Z9 H. ?5 p
  1.在form表单的文本框输入 "'or'='or'"或者"and 1=1"- Q' W* u. _2 Z1 P! v
9 J0 E& k% ^1 j4 f" a3 [
  在查询数据库的语句就应该是:8 G* v  q8 a: F) B2 Q
8 n$ D  G1 c& C7 p
  SELECT admin from where login = `user`=''or‘1’=1' or `pass`=‘xxxx'
" v7 A! k- I- S- a0 w1 |! `* V0 f% K
/ Q0 T- t; o* [' Q  当然也不会出现什么错误,因为or在sql的语句中代表和,或的意思。当然也会提示错误。
: s; L  V1 n+ T1 O5 Q* u: d) y/ K! n- z
  当时我们已经发现了可以执行SQL语句之后就可以查询当前表的所有信息。例如:正确的管理员账户和密码进行登录入侵。。1 W1 v$ t1 W* h* `, `0 [9 p

& s! g1 V6 u8 X  修复方式1:
! @, F9 A5 ^4 C& r# s' b0 I- s3 T8 S5 {7 T8 P- y. |* v8 T
  使用javascript脚本过滤特殊字符(不推荐,指标不治本)
. G! e5 f8 S! b3 a% _4 Z' T. K6 l2 `0 H! j( e' U
  如果攻击者禁用了javascript还是可以进行SQL注入攻击。。
$ L* e3 j4 m* b. {- f% r3 ?
3 z9 b( N4 R+ ]( m; \7 O  修复方式2:8 D6 y* a9 M: P  X# ~, l+ v# E  k* s

% U# c7 [. h+ C7 y  使用mysql的自带函数进行过滤。
! Y. m/ W; E0 G/ J* n8 s
3 y1 L# @) l+ J- H1 j  见代码:
: L2 T# [! v8 z: S
- ^) I2 `+ J: k  
, Y, I1 _4 U. x" z3 X) ?4 k0 z2 e3 r$ d; s) G0 p* i& u
  // 省略连接数据库等操作。。# ^9 g- i) h+ |, ^
) p9 v# _& U2 b5 ?$ c' a: u2 V
  $user=mysql_real_escape_string($_POST['user']);( ?) i- R7 L/ m% [

, s4 T: a5 Z9 u$ x  mysql_query("select * from admin whrer `username`='$user'");" L' ~7 D# A. q1 b% d- m7 G: g

$ {( @) P" O' ^% l5 O2 {  ?>" f( V7 o4 _8 G& y6 E: b

( ^+ s* K5 P* R$ S# F/ U' x  既然前面说道了xss攻击,我们再来说说XSS攻击以及防范吧。。% }. w+ g9 C! s! u3 {! m
  c8 \( u8 r4 t* H
  提交表单:
7 B* b/ p0 S* D! x1 p+ J0 M4 ^3 J7 O3 T
  
6 |1 C5 O- l; t; I+ \0 P0 F' J1 `" o; V, n' Q
  & m5 V- Y& ]2 Z+ \. _  h# M8 g

) E5 \) }# x: \% d3 Y" `5 V  
9 h- t0 q, ?% W% F
3 y$ w$ h9 b2 `  
, l5 J6 z$ H9 q/ s( _8 C. H. D+ r+ I+ G" {: l
  接收文件:
" M* E  K6 Y+ X1 ?( x( ~0 D# ?* B- e0 j, e) \0 j9 C
  if(empty($_POST['sub'])){
- L5 W: ?! `! A  T. c& t( {/ Q7 ?; l2 ^1 l: P% F# M: h8 x
  echo $_POST['test'];
6 y+ W( i8 }/ \" X" x0 a0 e$ u: U( k! ?$ `& O* k% v
  }
( V. [, ^9 q, Q8 D9 G7 d  n
9 m8 C2 P* R+ J; Z' i& j" E  很简单的一段代码,在这里只是模拟了下使用场景../ T- U1 B6 \4 l' u3 h2 Z% e

7 r4 }# g/ v- j9 I/ o1 L  加入攻击者提交
1 s3 d$ @2 D. v6 I: F/ Z: [1 `1 _2 \5 c; a: k$ z9 x8 ?
  
2 X+ J- F) z" _5 Z: A# q8 X. v
4 {, u9 j/ p' \  在返回的页面就应该显示当前页面的cookie信息。1 O2 L$ Q( G3 I$ C

' \# [6 H! V3 K  我们可以运用到某些留言板上(提前是没过滤的),然后当管理员审核改条信息时盗取COOKIE信息,并发送到攻击者的空间或者邮箱。。攻击者可以使用cookie修改器进行登陆入侵了。。
) L. D5 @  g' G7 b
. X1 L1 Z! ]; _% W& l' o  当然解决方案也有很多。。下面就介绍一个最常用的方式吧。
* X8 j' {2 S* g4 j* S& Q2 s8 F% G  n( x3 T! X8 o' @
  修复方案1:使用javascript进行转义
, {5 |, T3 ^% {: }- M- b5 E  O) M2 ?% V, d
  修复方案2:使用php内置函数进行转义+ \5 n4 s2 F7 W. n4 L; j
/ l% ]% }2 s% z4 o4 q
  代码如下:" S5 j5 H. d3 y+ g# b

6 s1 F6 {9 N& q  x( M; b  if(empty($_POST['sub'])){5 a5 q2 w" Q# Z

0 U: _3 A& b+ a0 u0 |  $str=$_POST['test'];
* ?, N+ n2 J! o& _5 `
! @0 \7 I+ S! j- G9 k1 [9 y, m  htmlentities($srt);
5 p1 s, n% z7 F
) Y  H% ]2 D0 G  echo $srt;1 @& a. P6 N* }" m. k1 z4 a
- t2 Q4 H& v" R3 D
  }
4 N3 d) E* s9 M6 u/ [( |/ z6 O( o) ^
) i, W, t/ ?0 w* y, b& u  好了,关于SQL注入攻击和XSS攻击的案例与修复方法就讲的差不多了。1 e. ], x9 w: j( x- ]% U- i
8 O: q. ?/ ~, V) S
  当然还有其他的解决方法:
* y# j: I' u: E) }3 m& S& g" A0 F0 `- v, _9 }9 d
  例如:使用php框架1 M- w& V9 k# H" }
, e& E2 L5 W# P6 G+ i4 h9 U
  还有其他的一些方法。。
* A. c$ ~3 J( C1 @( l* I2 L6 A9 a* q* g* }3 x) N' K
  当然了,XSS的运用范围与攻击方式很多也很广。
# s$ G& \/ v/ a* S; F! O( S  B
* |6 e' N5 L& F: u5 k( [- m  本文只针对php的提交方式进行过滤,还有其他的需要自己去研究
) z  C; t; [( q& k解决一切网站安全,湖盟云防火墙:hnhack.com
回复

使用道具 举报

what2016 发表于 2026-02-26 11:06:55 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-4-28 02:58 , Processed in 0.712091 second(s), 26 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

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