PHP Injection in MySQL works when hardcoded

General Tech Bugs & Fixes 2 years ago

0 2 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (2)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

I have the following SQL query that I can successfully test in Workbench:

        $interviewInfo = $this->db->fetchAll("
            SELECT 
                c.s,
                c.t,
                i.u,
                i.v,
                qa.w,
                i.x
            FROM
                XXX AS i,
                YYY as ip,
                ZZZ AS qa,
                BBB AS c
            WHERE
                c.s = :CompanyId AND ip.r = i.Id
                    AND i.s = c.s
                    AND ip.t = qa.p
                    AND i.h > 0
            ORDER BY i.q DESC
            LIMIT 3", array("CompanyId"=>$companyId));

But with the associative array dependency injection in my SQL statement, it returns an empty array.

I have tried directly inserting CompanyId in place of :CompanyId and then it works.

I have no idea what is going on here because there is:

  1. No error from MySQL.
  2. The query is correct and I can verify that.
  3. I can also verify CompanyId exists and is a valid integer.
 
profilepic.png
manpreet 2 years ago

This is not how PDOStatement::fetchAll works. You must first prepare your query, then execute it, and then you can call fetchAll to get the results. Something like this should work:

$stmt = $this->db-prepare("SELECT
                c.s,
                c.t,
                i.u,
                i.v,
                qa.w,
                i.x
            FROM
                XXX AS i,
                YYY as ip,
                ZZZ AS qa,
                BBB AS c
            WHERE
                c.s = :CompanyId AND ip.r = i.Id
                    AND i.s = c.s
                    AND ip.t = qa.p
                    AND i.h > 0
            ORDER BY i.q DESC
            LIMIT 3");
$stmt->execute(array("CompanyId"=>$companyId));
$interviewInfo = $stmt->fetchAll();

Note that you should also check that the prepare and execute statements succeeded by checking that $stmt is not false and that execute does not return false.


0 views   0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.