Zenit have 32 points from 13 games followed by Moscow's cross-town rivals Lokomotiv and Spartak on 24 points each from 12 matches. CSKA are fifth with 21 points from 13 matches.
For CSKA, it was a fourth league defeat in five games, during which they have also failed to score and only mustered a 0-0 home draw with bottom team Anzhi Makhachkala.
Their poor form continued at the Petrovski stadium as Zenit dominated throughout the match and nearly took a ninth-minute lead through Shirokov, who saw his swerving shot parried by reserve keeper Sergey Chepchugov.
The playmaker scored seven minutes later when he sprung the offside trap after he was put through by Andrey Arshavin and steered the ball home from a tight angle.
Zenit keeper Yuri Lodygin twice denied Nigeria striker Ahmed Musa before Hulk doubled the home side's lead with a superb shot with his weaker, right foot from 23 metres, curing the ball into the top left corner after creating space with a deft touch.
Lodygin produced two good saves in the second half and Zenit's Portuguese defender Neto cleared a Georgi Milanov header off the line before Oleg Shatov missed a sitter at the other end, scuffing his lob wide after an excellent fast break.
The outcome will have left Russia's traditional rivals in contrasting moods ahead of their Champions League fixtures next week, with Zenit away to twice former winners Porto on Tuesday and CSKA at home to Manchester City on Wednesday.