题目:
首先根据题目EasySQL,猜测是SQL注入
知识点:
mysql语句中 and or 和 () 的优先级
()>and>or
分析:
先只输入用户名admin看看会不会报错
只输入密码也是报这个错,说明这里用户名和密码都有值才能进行sql语句验证
要点:
1.有数据交互的地方容易产生注入点
2.sql注入的核心:将用户输入的数据拼接到代码中,并被当成 sql 语句执行
第一步——找到页面与数据库产生交互的地方
这里找到一个登陆点,先输入任意,点登陆
看到点登陆后跳转到check.php页面,并得到结果如下红字。可知此页面,即check.php这个页面会与数据库产生交互,并且接收的是登陆点的数据,也就是登陆点页面也会与数据库产生交互
那我们就知道了可与数据库产生交互的地方是登陆点
第二步——判断SQL语句闭合方式
现在判断他是什么闭合
先尝试注入单引号,输入用户名admin 密码admin’
报错了,拿到报错信息如下
判断SQL语句闭合方式的原理:
MYSQL数据库的包容性比较强。例如输入1)、1″、1-等,这些数字后面的字符不是闭合符,数据库也会把这些输入的错误数据转换成正确的数据类型。 但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合。如果闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。
分析:
输入1、1’、1″判断SQL语句闭合方式
一般情况下,SQL语句闭合方式是单引号
输入用户名:1 密码:1″时,没有发生SQL语句报错,即没有产生报错信息,只是提示我们输入的值是不对的(提示”Input your username and password”),说明这里注入双引号并没有使sql语句报错,因此我们可以先假设SQL语句闭合方式是单引号
假设闭合方式是单引号,那么形成的sql语句是SELECT * FROM table_name WHERE username=” and password=”;
密码统一给1
username传入1时,形成的sql语句是SELECT * FROM table_name WHERE username=’1′ and password=’1′; 这样不会报错,闭合没问题,只是会提示账号密码不正确,“Input your username and password” 不会有报错信息返回
username传入1″时,形成的sql语句是SELECT * FROM table_name WHERE username=’1″‘ and password=’1’; 这样也不会报错,形成的sql语句是正确的,因为单引号包裹一个双引号时,这个双引号当做普通字符处理,并没有引号作用
同理,当字符串内需要包含单引号时,除了使用转义字符外,也可以使用一对双引号来包括字符串。字符串内的单引号被当做普通字符
username传入1′时,形成的sql语句是SELECT * FROM table_name WHERE username=’1” and password=’1′; 这样的sql语句是错误的,因为第一个’和我们传入的’闭合了,剩下第三个单引号’没有东西来闭合,所以sql语句出错了,带入数据库产生了报错信息
结合实际尝试,我们输入1″ 1的时候没有报错,输入1′ 1的时候返回了报错信息,逆着推说明假设是成立的,可以推出SQL语句闭合方式是单引号
猜测后台的sql语句如下:
sql=”select * from user where username=’$username&’and password=’$password&'”
第三步——进行SQL注入
方法一:万能账号密码
一般来说,有登陆点的题,在判断完闭合方式后,可以优先尝试用万能账号密码登陆
使用万能密码尝试登陆
知道该数据库闭合方式为单引号闭合 所以此处使用单引号字符型的万能密码
‘ or 1=1 #
好文阅读
发表评论